【问题标题】:How to manipulate individual elements in a numpy array iteratively如何迭代地操作numpy数组中的单个元素
【发布时间】:2017-02-17 16:31:15
【问题描述】:

假设我想遍历一个 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

【问题讨论】:

  • ij索引。您需要迭代i in range(row)j in range(column)。然后您可以将space[i, j] 设置为您想要的任何值。
  • 我应该补充一点,将循环用于简单任务会破坏使用 numpy 的目的,因为您将失去 numpy 提供的任何速度优势。了解 numpy indexing,它允许您使用索引列表分配到多个位置,这将比使用循环快得多
  • 我已经阅读该页面有一段时间了。我无法就如何做到这一点建立联系。我应该在哪个标题下查看该链接?或者,如果你能提供一个如何做类似事情的例子,它会对我有很大的启发。谢谢!

标签: arrays python-2.7 numpy iteration


【解决方案1】:

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

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

In [814]: x-np.arange(3)[:,None]
Out[814]: 
array([[1, 1],
       [1, 0],
       [0, 1]])

【讨论】:

    【解决方案2】:

    开始于:

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

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

    相关的numpy docs on indexing are here

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

    从简单开始,阅读一些文档和教程。在我看到 Praveen 的评论后,我对这里的这个简单答案感到有点糟糕,它并没有提供比他的评论更多的东西,但也许上面的链接正是你所需要的。

    通过尝试学习numpy的一般感言

    • 定期使用 arr.shape 检查尺寸
    • 定期使用arr.dtype检查数据类型

    因此,在您的情况下,以下应该给您一个警告(不是 python 警告;一个在您的脑海中),因为您可能期望 i 迭代 one 维度的值:

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

    【讨论】:

    • 你和 Praveen 的 cmets 都解决了这个问题。老实说,我认为对于 numpy 数组来说它必须是更复杂的东西。但显然不是!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2014-03-11
    • 2023-01-20
    • 2017-12-10
    • 2018-11-17
    • 2016-04-27
    • 1970-01-01
    相关资源
    最近更新 更多