任意维度的Numpy数组顺序索引数组

时间:2018-01-23 15:14:02

标签: python arrays numpy multidimensional-array

当维度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生成) 。

2 个答案:

答案 0 :(得分:1)

您可以使用A = A.T.reshape(-1,n)的以下变体:

B = A.reshape(n, -1).T
  • A未被覆盖,其网格结构仍保留。
  • 没有数据被复制 - BA的视图(只有在.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]]]

但与基于视图的方法相比,唯一的优势可能是:我们不需要小心视图与副本。