当维度n
的数量是任意的时,是否可以按顺序索引numpy数组中的点?
n=4
时所需行为的示例:>>> A = np.mgrid[[slice(0,11,1)]*4]
>>> A[XXX_0] # The "first" point in A
array([0,0,0,0])
>>> A[XXX_1] # The "second" point in A
array([0,0,0,1])
>>> A[XXX_11]
array([0,0,1,0])
>>> A[XXX_14640] # The "last" point in A
array([10,10,10,10])
为了获得上述输出,应该替换上面的XXX
?
我不想将A
转换为2D数组(例如,使用A = A.T.reshape(-1,n)
),因为这会删除我的应用程序所必需的网格结构(由mgrid
生成) 。
答案 0 :(得分:1)
您可以使用A = A.T.reshape(-1,n)
的以下变体:
B = A.reshape(n, -1).T
A
未被覆盖,其网格结构仍保留。B
是A
的视图(只有在.T
之前重塑时才有效)现在,您可以使用A
访问网格结构中的数据,B
访问平面结构中的相同数据。
示例:
A = np.mgrid[[slice(0,11,1)]*4]
B = A.reshape(4, -1).T
# modify first point
print(B[0]) # [0 0 0 0]
B[0] = [1, 3, 3, 7]
print(A[:, 0, 0, 0, 0]) # [1 3 3 7]
答案 1 :(得分:0)
对于某些情况的一些潜在解决方法(您的示例有点宽泛):
代码:
import numpy as np
A = np.mgrid[[slice(0,3,1)]*2]
print(A)
access_indices = np.arange(A.size) # this one looks like your 0, 1, 2
flat_indices = np.unravel_index(access_indices, A.shape)
A[flat_indices] -= 1
print(A)
输出:
[[[0 0 0]
[1 1 1]
[2 2 2]]
[[0 1 2]
[0 1 2]
[0 1 2]]]
[[[-1 -1 -1]
[ 0 0 0]
[ 1 1 1]]
[[-1 0 1]
[-1 0 1]
[-1 0 1]]]
但与基于视图的方法相比,唯一的优势可能是:我们不需要小心视图与副本。