【发布时间】:2020-06-12 04:55:08
【问题描述】:
A 是一个 k 维 numpy 浮点数数组(k 可能非常大,例如最多 10 个)
我需要通过递增每个值来实现对 A 的更新(如下所述)。我想知道是否有一种 numpy 风格的方式会很快。
设L_i为axis i的长度
此数组的更新分两步生成:
为 A 的每个轴生成一个对应的向量 G。 例如,对应于轴 i,生成长度为 L_i 的向量 G_i(从数据中)。
通过计算 A 中每个位置的 G 向量的增量来更新所有位置的 A
要在任何特定位置执行此操作,设 p 是一个由 k 个索引组成的数组,对应于 A 中的一个位置。然后 p 处的 A 增加一个计算为乘积的值:
Product(G_i[p[i]], for i from 0 to k-1)
对 A 的完整更新涉及对 A 中的所有位置(即 p 的所有可能值)执行此操作
此操作通过循环逐个执行位置会非常慢。
有没有一种 numpy 风格的方法可以快速做到这一点?
编辑
## this for three dimensions, final matrix at pos i,j,k has the
## product of c[i]*b[j]*a[k]
## but for arbitrary # of dimensions it will have a loop in a loop
## and will be slow
import numpy as np
a = np.array([1,2])
b = np.array([3,4,5])
c = np.array([6,7,8,9])
ab = []
for bval in b:
ab.append(bval*a)
ab = np.stack(ab)
abc = []
for cval in c:
abc.append(cval*ab)
abc = np.stack(abc)
作为一个函数
def loopfunc(arraylist):
ndim = len(arraylist)
m = arraylist[0]
for i in range(1,ndim):
ml = []
for val in arraylist[i]:
ml.append(val*m)
m = np.stack(ml)
return m
【问题讨论】:
-
描述很难理解。您能否提供一个 A 形状 (3, 4) 的代码示例,即 k=2?
-
对于 k=2 它只是两个向量的点积,例如一个长度为 L_i 的向量乘以一个长度为 L_j 的向量,得到一个暗淡 L_i,L_j 的矩阵。将此矩阵称为 x。现在,如果我们有长度为 L_k 的第三个向量 c,我正在谈论的产品将包含一个新的 dim L_i,L_j, L_k 数组。该数组的第一个元素是 x 的副本,其中所有值都乘以 c 的第一个元素。这个 3D 数组的第二个元素是 x 的副本,其中所有值都乘以 c 的第二个元素。等等等等希望有帮助
-
请展示几行代码,您将如何手动处理一个小数组,否则我们会因对您想要的内容的误解而反复出现。
-
我在原帖中加了一段代码