You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用循环实现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)

代码解释:

  1. my_data @ my_data.T:矩阵乘法生成n×n矩阵,其中[i,j]位置的元素是my_data第i行与第j行的点积,一步完成所有行对的点积计算。
  2. np.sum(..., axis=1):对每行求和,得到的数组第t位就是第t行与整个数组所有行的点积总和,对应需求中的步骤2和3。
  3. n - np.arange(n):生成[5,4,3,2,1]的分母数组,匹配每个t对应的n-t。
  4. dot_sum / denominators:借助Numpy广播机制,逐元素完成除法运算,直接得到最终结果数组。

运行输出:

[ 45.  40.  30.  16.   5.]

内容的提问来源于stack exchange,提问作者user366312

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:20:00