np.nditer
自动迭代行数组的元素。有没有办法以列方式迭代数组的元素?
x = np.array([[1,3],[2,4]])
for i in np.nditer(x):
print i
# 1
# 3
# 2
# 4
我想要的是:
for i in Columnwise Iteration(x):
print i
# 1
# 2
# 3
# 4
我最好的选择是在进行迭代之前转换我的数组吗?
答案 0 :(得分:3)
为了完整性,您不必在迭代元素之前转置矩阵。使用np.nditer
,您可以指定如何遍历矩阵的顺序。默认值通常是row-major或C-like顺序。您可以覆盖此行为并选择您想要的列主要或 FORTRAN 类似的顺序。只需指定其他参数order
,并在使用'F'
时将此标记设置为np.nditer
:
In [16]: x = np.array([[1,3],[2,4]])
In [17]: for i in np.nditer(x,order='F'):
....: print i
....:
1
2
3
4
您可以在此处详细了解如何控制迭代顺序:http://docs.scipy.org/doc/numpy-1.10.0/reference/arrays.nditer.html#controlling-iteration-order
答案 1 :(得分:2)
你可以调换它吗?
>>> x = np.array([[1,3],[2,4]])
>>> [y for y in x.T]
[array([1, 2]), array([3, 4])]
或不那么优雅:
>>> [np.array([x[j,i] for j in range(x.shape[0])]) for i in range(x.shape[1])]
[array([1, 2]), array([3, 4])]
答案 2 :(得分:2)
您可以使用形状并切片每列
>>> [x[:, i] for i in range(x.shape[1])]
[array([1, 2]), array([3, 4])]
答案 3 :(得分:2)
In [832]: x=np.array([[1,3],[2,4]])
In [833]: x
Out[833]:
array([[1, 3],
[2, 4]])
In [834]: for i in x:print i # print each row
[1 3]
[2 4]
In [835]: for i in x.T:print i # print each column
[1 2]
[3 4]
In [836]: for i in x.ravel():print i # print values in order
1
3
2
4
In [837]: for i in x.T.ravel():print i # print values in column order
1
2
3
4
不是这种情况下最好的迭代工具。它在编译(cython)解决方案时非常有用,但在纯Python编码中则不行。
查看一些常规迭代策略:
I need to fill values into an array based on the index of each cell in the array
您发表评论:index
In [838]: for i in range(2):
.....: for j in range(2):
.....: print (i,j),x[i,j]
(0, 0) 1
(0, 1) 3
(1, 0) 2
(1, 1) 4
是什么意思?
带索引的粗略的2d迭代:
ndindex
nditer
使用In [841]: for i,j in np.ndindex(x.shape):
.....: print (i,j),x[i,j]
.....:
(0, 0) 1
(0, 1) 3
(1, 0) 2
(1, 1) 4
生成类似的索引
enumerate
In [847]: for i,v in enumerate(x):print i,v
0 [1 3]
1 [2 4]
是获取值和索引的一种很好的Python方法:
meshgrid
或者您可以使用In [843]: I,J=np.meshgrid(range(2),range(2))
In [844]: I
Out[844]:
array([[0, 1],
[0, 1]])
In [845]: J
Out[845]:
array([[0, 0],
[1, 1]])
In [846]: x[I,J]
Out[846]:
array([[1, 2],
[3, 4]])
生成所有索引,如数组
x
请注意,大多数这些迭代方法只是将您的数组视为列表列表。他们没有利用数组的性质,与使用整个int main()
{
DayOfYear someDay;
someDay.output();
return 0;
}
的方法相比,它们会很慢。