0

我正在尝试使用索引和数组迭代地访问一个 numpy 数组。以下示例几乎总结了我的问题:

x = np.arange(12)
x.shape = (3,2,2)
nspace = np.array([[0,0], [0,1], [1,0], [1,1]])
for it in range(len(nspace)):
    x[:,nspace(it)] = np.array([1,1,1])

如果事情按照我的想法进行,代码将打印 4 个单独的数组:

[0,4,8]
[1,5,9]
[2,6,10]
[3,7,11]

但我得到一个错误。我知道我的索引是错误的,但我无法弄清楚如何获得我想要的结果。

重要的是一切都发生在一个循环中,因为我希望能够改变 x 的尺寸。

EDIT0:我需要一个确实需要的通用解决方案。我要写:空格[0,0]、空格[0,1]等。

EDIT1:我将打印更改为赋值操作,因为实际需要的是分配我在循环内调用的函数的结果。

EDIT2:我没有包括 Traceback,因为我怀疑它是否有用。无论如何,这里是:

Traceback (most recent call last):

  File "<ipython-input-600-50905b8b5c4d>", line 5, in <module>
    print(x[:,nspace(it)])

TypeError: 'numpy.ndarray' object is not callable
4

3 回答 3

1

您不需要使用for循环。使用reshapetranspose

x.reshape(3, 4).T

给出:

array([[ 0,  4,  8],
       [ 1,  5,  9],
       [ 2,  6, 10],
       [ 3,  7, 11]])

如果你想迭代结果:

for row in x.reshape(3, 4).T:
    print(row)
于 2019-01-28T21:02:22.583 回答
0

您会收到错误消息,因为您应该在最后一行使用方括号来访问元素。

import numpy as np

x = np.arange(12)
x.shape = (3,2,2)
nspace = np.array([[0,0], [0,1], [1,0], [1,1]])
for it in range(len(nspace)):
    print(x[:,nspace[it]])

编辑:

获得预期结果的一种可能解决方案:

import numpy as np

x = np.arange(12)
x.shape = (3,2,2)
nspace = np.array([[0,0], [0,1], [1,0], [1,1]])

y = x.flatten()

for i in range(x.size//x.shape[0]):
    print y[i::4]
于 2019-01-28T20:58:51.823 回答
0

您需要提供第一个和第二个索引并使用[]括号而不是()访问数组元素。

import numpy as np

x = np.arange(12)
x.shape = (3,2,2)

for it in range(len(nspace)):
    print(x[:,nspace[it][0], nspace[it][1]])

输出

[0 4 8]
[1 5 9]
[ 2  6 10]
[ 3  7 11]

也可以reshape直接用作

x = np.arange(12).reshape(3,2,2)
于 2019-01-28T21:00:50.947 回答