如何将其所有索引值与 python 的总和添加到 numpy ndarray 的每个元素?
How can I add to each element of a numpy ndarray the sum of all its index values with python ?
我有一个 numpy ndarray,让我们举个例子(但它可以完全不同):
[[[0 0 0]
[1 1 1]
[0 0 0]]
[[1 0 1]
[1 0 1]
[1 0 1]]]
[[1 0 0]
[1 1 0]
[1 1 1]]]
我想向每个元素添加其在所有维度中的索引之和。
这里的结果是:
[[[ 0 1 2]
[ 4 5 6]
[ 6 7 8]]
[[10 10 12]
[13 13 15]
[16 16 18]]
[[19 19 20]
[22 23 23]
[25 26 27]]]
为此,我构建了另一个 ndarray:
shp = a.shape
b = np.arange(shp[0]**len(shp)).reshape(shp)
我得到了我的结果:
result = a+b
我想知道是否有更直接的解决方案,不需要创建第二个 ndarray,这是一种执行相同操作的方法 'on location' ??
简单地创建开放网格,这些网格基本上是扩展到更多暗淡的一维数组,并利用 broadcasting
-
添加到输入数组中
m,n,r = a.shape
I,J,K = np.ogrid[:m,:n,:r]
out = a + I*n*r + J*r + K
因此,就内存占用而言,我们只创建了 9 (=m+n+r) 个元素,而不是使用 range-based
解决方案创建的 27 (= m * n * r) 个元素。
样本运行-
In [41]: a
Out[41]:
array([[[0, 0, 0],
[1, 1, 1],
[0, 0, 0]],
[[1, 0, 1],
[1, 0, 1],
[1, 0, 1]],
[[1, 0, 0],
[1, 1, 0],
[1, 1, 1]]])
In [42]: m,n,r = a.shape
In [43]: I,J,K = np.ogrid[:m,:n,:r]
In [44]: a + I*n*r + J*r + K
Out[44]:
array([[[ 0, 1, 2],
[ 4, 5, 6],
[ 6, 7, 8]],
[[10, 10, 12],
[13, 13, 15],
[16, 16, 18]],
[[19, 19, 20],
[22, 23, 23],
[25, 26, 27]]])
N维数组案例
对于通用的 n-dim 数组,a
添加到自身 -
shp = a.shape
grid = np.ogrid[tuple(map(slice, shp))]
scale = np.r_[np.array(shp)[::-1].cumprod()[::-1][1:],1]
for i,j in zip(grid,scale):
a += i*j
我有一个 numpy ndarray,让我们举个例子(但它可以完全不同):
[[[0 0 0]
[1 1 1]
[0 0 0]]
[[1 0 1]
[1 0 1]
[1 0 1]]]
[[1 0 0]
[1 1 0]
[1 1 1]]]
我想向每个元素添加其在所有维度中的索引之和。 这里的结果是:
[[[ 0 1 2]
[ 4 5 6]
[ 6 7 8]]
[[10 10 12]
[13 13 15]
[16 16 18]]
[[19 19 20]
[22 23 23]
[25 26 27]]]
为此,我构建了另一个 ndarray:
shp = a.shape
b = np.arange(shp[0]**len(shp)).reshape(shp)
我得到了我的结果:
result = a+b
我想知道是否有更直接的解决方案,不需要创建第二个 ndarray,这是一种执行相同操作的方法 'on location' ??
简单地创建开放网格,这些网格基本上是扩展到更多暗淡的一维数组,并利用 broadcasting
-
m,n,r = a.shape
I,J,K = np.ogrid[:m,:n,:r]
out = a + I*n*r + J*r + K
因此,就内存占用而言,我们只创建了 9 (=m+n+r) 个元素,而不是使用 range-based
解决方案创建的 27 (= m * n * r) 个元素。
样本运行-
In [41]: a
Out[41]:
array([[[0, 0, 0],
[1, 1, 1],
[0, 0, 0]],
[[1, 0, 1],
[1, 0, 1],
[1, 0, 1]],
[[1, 0, 0],
[1, 1, 0],
[1, 1, 1]]])
In [42]: m,n,r = a.shape
In [43]: I,J,K = np.ogrid[:m,:n,:r]
In [44]: a + I*n*r + J*r + K
Out[44]:
array([[[ 0, 1, 2],
[ 4, 5, 6],
[ 6, 7, 8]],
[[10, 10, 12],
[13, 13, 15],
[16, 16, 18]],
[[19, 19, 20],
[22, 23, 23],
[25, 26, 27]]])
N维数组案例
对于通用的 n-dim 数组,a
添加到自身 -
shp = a.shape
grid = np.ogrid[tuple(map(slice, shp))]
scale = np.r_[np.array(shp)[::-1].cumprod()[::-1][1:],1]
for i,j in zip(grid,scale):
a += i*j