如何迭代地操作numpy数组中的各个元素

时间:2016-10-08 22:48:45

标签: arrays python-2.7 numpy iteration

假设我想迭代一个numpy数组并打印每个项目。我将在稍后使用它来根据一些规则操纵我的数组中的(i,j)条目。

我已经阅读了numpy文档,看起来你可以使用类似的索引(或切片)来轻松访问数组中的各个元素。但是当我尝试在循环中访问它时,似乎我无法对每个(i,j)条目做任何事情。

row= 3
column = 2
space = np.random.randint(2, size=(row, column))
print space, "\n"

print space[0,1]
print space[1,0]   #test if I can access indiivdual elements

输出:

[[1,1
 [1,1
 [0,0]]

1
1

例如,使用上面的内容我想迭代每一行和每一行并打印每个条目。我会考虑使用以下内容:

for i in space[0:row,:]:
    for j in space[:,0:column]:
        print space[i,j]

我得到的输出是

[1,1]
[1,1]
[1,1]
[1,1]
[1,1]
[1,1]
[1,1]
[1,1]
[1,1]

显然这不起作用。我认为问题是我访问整个行和列而不是任何给定行和列中的元素。我已经过了几个小时的numpy文档了,我仍然不确定如何解决这个问题。

我主要担心的是我想通过使用循环和一些条件来改变每个(i,j)条目,例如(使用上面的循环):

for i in space[0:row,:]:
    for j in space[:,0:column]:
         if [i+1,j] + [i,j+1] == 2:
             [i,j] = 1

2 个答案:

答案 0 :(得分:2)

开始于:

for i in range(row):
    for j in range(column):
        print space[i,j]

您正在循环中生成索引,然后索引某个元素!

相关的numpy docs on indexing are here

但看起来,您还应该阅读基本的python-loops

开始简单并阅读一些文档和教程。在我看到 Praveen 的评论后,我觉得这里的这个简单的答案有点不好,这个答案并不比他的评论多得多,但也许上面的链接正是你所需要的。< / p>

通过尝试

来学习numpy的一般性评论
  • 定期使用arr.shape检查尺寸
  • 定期使用arr.dtype检查数据类型

所以在你的情况下,下面的内容应该给你一个警告(不是python;你脑子里有一个),因为你可能希望我迭代一个维度的值:

print((space[0:row,:]).shape)
# output: (3, 2)

答案 1 :(得分:1)

迭代二维数组有很多种方法:

N

按行:

In [802]: x=np.array([[1,1],[1,0],[0,1]])
In [803]: print(x)    # non-iteration
[[1 1]
 [1 0]
 [0 1]]

添加In [805]: for row in x: ...: print(row) [1 1] [1 0] [0 1] 以获取索引

enumerate

双级迭代:

In [806]: for i, row in enumerate(x):
     ...:     row += i

In [807]: x
Out[807]: 
array([[1, 1],
       [2, 1],
       [2, 3]])

当然你可以迭代范围:

In [808]: for i, row in enumerate(x):
     ...:     for j, v in enumerate(row):
     ...:         print(i,j,v)         
0 0 1
0 1 1
1 0 2
1 1 1
2 0 2
2 1 3

哪个最好取决于您是否需要使用这些值,还是需要修改它们。如果修改,您需要了解该项目是否可变。

但请注意,我可以在没有显式迭代的情况下删除for i in range(x.shape[0]): for j in range(x.shape[1]): x[i,j]... for i,j in np.ndindex(x.shape): print(i,j,x[i,j])

+1