Python 使用数组/索引进行切片

Python 使用数组/索引进行切片,python,numpy,numpy-slicing,Python,Numpy,Numpy Slicing,我尝试使用索引和数组迭代访问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,

我尝试使用索引和数组迭代访问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 (most recent call last):

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

TypeError: 'numpy.ndarray' object is not callable
回溯(最近一次呼叫最后一次):
文件“”,第5行,在
打印(x[:,nspace(it)])
TypeError:“numpy.ndarray”对象不可调用

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

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]

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

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]
您也可以直接使用
重塑

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

您不需要为循环使用
。使用
重塑
转置

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)

“但我有一个错误”:在你的问题中显示实际的错误总是好的(包括完整的回溯)。在这里,它可能看起来很明显,但除此之外,错误可能非常有用。如果您发布遇到的错误的堆栈跟踪,将有很大帮助。我假设引发了索引器异常,但这只是猜测,没有堆栈跟踪。您花费了大量时间添加编辑,而没有在发布之前查看已解决问题的两个工作答案(这不会使任何一种方法无效)。。。是你干的吗?是的。我知道结果不好,我只想指出原始代码中错误的原因。一枪打死三只鸟;)@是的,现在我在考虑你的答案,因为我可能太复杂了?出于尊重,我不敢对你的答案说一句话。但是,是的,它看起来有点过于浓缩,尽管非常好:)@Bazingaa我不太关心操作的链接——毕竟这是数组编程:)但是我有没有不必要的步骤?我认为
ravel()
是必要的,但我的一部分人认为有一条较短的路线。
x.reformate(3,4).T
也有效。在这种情况下不需要拉威尔