如何不使用循环实现Numpy数组的指定序列计算并返回结果数组?
问题描述
给定如下Numpy数组:
import numpy as np my_data = np.array( [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5]]) n = len(my_data) # 5
需要对t=0、1、2、3、4执行以下计算:
- 取第
t行; - 计算该行与整个数组的点积;
- 对结果求和;
- 除以
(n-t); - 将所有结果以数组形式返回。
示例(t=0时):
t = 0 v0 = my_data[t:,] my_data_dot = np.dot(my_data, v0) my_data_sum = np.sum(my_data_dot)/(n-t)
要求不使用循环语句,给出最简实现方法。
无循环最简实现
利用Numpy的矩阵运算和广播特性,可以一次性完成所有计算,代码如下:
import numpy as np my_data = np.array( [[1, 1, 1], [2, 2, 2], [3, 3, 3], [4, 4, 4], [5, 5, 5]]) n = len(my_data) # 计算每行与所有行的点积之和 dot_sum = np.sum(my_data @ my_data.T, axis=1) # 生成对应每个t的分母数组 denominators = n - np.arange(n) # 逐元素相除得到最终结果 result = dot_sum / denominators print(result)
代码解释:
my_data @ my_data.T:矩阵乘法生成n×n矩阵,其中[i,j]位置的元素是my_data第i行与第j行的点积,一步完成所有行对的点积计算。np.sum(..., axis=1):对每行求和,得到的数组第t位就是第t行与整个数组所有行的点积总和,对应需求中的步骤2和3。n - np.arange(n):生成[5,4,3,2,1]的分母数组,匹配每个t对应的n-t。dot_sum / denominators:借助Numpy广播机制,逐元素完成除法运算,直接得到最终结果数组。
运行输出:
[ 45. 40. 30. 16. 5.]
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

