numpy.ndindex和数组切片

时间:2015-04-15 13:03:40

标签: python numpy

我有一个多维数组,我希望得到1D切片,例如mega_array[:, i, j, k, .....]

为此,我尝试numpy.ndindex:

for idx in np.ndindex(mega_array.shape[1:]):
    print mega_array[:, index]

但是唉:这仍然给了我多维切片,其中只有维度,除了第一个,等于一。

我想将切片用作l值,因此,简单的ravel()不适用于此。

我应该使用什么来获得正常的1D切片?


UPD:这是一个小例子:

in_array = np.asarray([[7, 40], [777, 440]])
    for index in np.ndindex(in_array.shape[1:]):
        print "---"
    print index
    print in_array[:, index] # gives 2D array

UPD:这是一个3D示例:

in_array = np.asarray([[[7, 40, 5], [777, 440, 0]], [[8, 41, 6], [778, 441, 1]]])
print in_array
print in_array.shape
# print in_array[:, 0, 2]
for index in np.ndindex(in_array.shape[1:]):
    print index
    print in_array[:, index]  # FAILS

# expected [7, 8], [40, 41], [5, 6], [778, 441] and so on.

4 个答案:

答案 0 :(得分:2)

您需要向slice添加index

在:

in_array = np.asarray([[7, 40], [777, 440]])
for index in np.ndindex(in_array.shape[1:]):
    print "---"
    print index
    print in_array[:, index] # gives 2D array

index的值为(0,)(1,),即元组。

in_array[:,(1,)]in_array[:,1]不同。要获得后者,您需要使用in_array[(slice(None),1)]slice必须是索引元组的一部分。我们可以通过连接元组来做到这一点。

in_array = np.asarray([[7, 40], [777, 440]])
for index in np.ndindex(in_array.shape[1:]):
    print "---"
    index = (slice(None),)+index
    print index
    print in_array[index]

打印:

---
(slice(None, None, None), 0)
[  7 777]
---
(slice(None, None, None), 1)
[ 40 440]

相同的调整应该适用于nD数组大小写

答案 1 :(得分:1)

您可以使用np.dstack按序列深度方式(沿第三轴)堆叠数组。 :

>>> a
array([[[  7,  40,   5],
        [777, 440,   0]],

       [[  8,  41,   6],
        [778, 441,   1]]])
>>> np.dstack(a)
array([[[  7,   8],
        [ 40,  41],
        [  5,   6]],

       [[777, 778],
        [440, 441],
        [  0,   1]]])

同样根据您的尺寸,您可以使用其他numpy连接功能:http://docs.scipy.org/doc/numpy/reference/routines.array-manipulation.html#joining-arrays

答案 2 :(得分:0)

你需要transpose矩阵来获取行吗?

In [5]: in_array = numpy.asarray([[7, 40], [777, 440]])
In [6]: in_array.transpose()[0]
Out[6]: array([  7, 777])

答案 3 :(得分:0)

发布3D示例后,现在我看到了您想要做的事情。以下内容适用于具有3个以上维度的数组:

保存尺寸>中的项目数量0,

nitems = np.product(in_array.shape[1:])

重塑数组(类似于Kasra指出的np.dstack),

new_array = np.reshape(in_array, [in_array.shape[0], nitems])

循环新数组:

for i in range(new_array.shape[1]):
    print(new_array[:, i])

对我来说,这给出了预期的输出。