递增 3d numpy 数组中元素子集的元素 python
Increment elements of a subset of elements in a 3d numpy array python
我有一个由
组成的 3d 列表
myArray = np.array([[[0]*n for i in range(m)] for j in range(o)])
我有一个遍历所有元素的循环,并递增当前元素中存储的值以及当前元素附近的一些元素:
myArray[xa:xb][ya:yb][za:zb] += 1.
其中xa
、xb
等是根据循环中考虑的当前元素生成的,不一定相同。换句话说,我想增加 3D 列表中给定子三角形的值。
但是,当我尝试寻址 myArray[xa:xb][0][0]
时,我得到一个长度大于 len(myArray[0])
的列表。更不用说 myArray[xa:xb][ya:yb][za:zb] += 1
会导致比预期更多的元素增加 1
。
我可以通过使用三个嵌套的 for 循环来实现:
for i in range(xa,xb+1):
for j in range(ya,yb+1):
for k in range(za,zb+1):
myArray[i][j][k] += 1
但这会大大降低代码速度。
我该怎么做才能在不损失性能的情况下实现这一目标?
您从一开始就走在正确的道路上。以下似乎有效:
myArray=np.zeros((o,m,n))
myArray[xa:xb+1,ya:yb+1,za:zb+1]+=1
请注意,数组中的索引切片使用与 for
循环中的 range
相同的边界,因此您必须 +1
结束索引。上面的过程在很短的时间内复制了你的三重 for
循环结果。
我有一个由
组成的 3d 列表myArray = np.array([[[0]*n for i in range(m)] for j in range(o)])
我有一个遍历所有元素的循环,并递增当前元素中存储的值以及当前元素附近的一些元素:
myArray[xa:xb][ya:yb][za:zb] += 1.
其中xa
、xb
等是根据循环中考虑的当前元素生成的,不一定相同。换句话说,我想增加 3D 列表中给定子三角形的值。
但是,当我尝试寻址 myArray[xa:xb][0][0]
时,我得到一个长度大于 len(myArray[0])
的列表。更不用说 myArray[xa:xb][ya:yb][za:zb] += 1
会导致比预期更多的元素增加 1
。
我可以通过使用三个嵌套的 for 循环来实现:
for i in range(xa,xb+1):
for j in range(ya,yb+1):
for k in range(za,zb+1):
myArray[i][j][k] += 1
但这会大大降低代码速度。 我该怎么做才能在不损失性能的情况下实现这一目标?
您从一开始就走在正确的道路上。以下似乎有效:
myArray=np.zeros((o,m,n))
myArray[xa:xb+1,ya:yb+1,za:zb+1]+=1
请注意,数组中的索引切片使用与 for
循环中的 range
相同的边界,因此您必须 +1
结束索引。上面的过程在很短的时间内复制了你的三重 for
循环结果。