Python Numpy 二维数组迭代

1 投票
2 回答
1580 浏览
提问于 2025-04-17 06:18

想要创建一个列表,里面存的是一个二维布尔数组中值为True的元素的索引。

import numpy
arr = numpy.zeros((6,6), numpy.bool_)
arr[2,3] = True
arr[5,1] = True
results1 = [[(x,y) for (y,cell) in enumerate(arr[x].flat) if cell] for x in xrange(6)]
results2 = [(x,y) for (y,cell) in enumerate(arr[x].flat) if cell for x in xrange(6)]

结果1:

[[], [], [(2, 3)], [], [], [(5, 1)]]

结果2完全错误

目标:

[(2, 3),(5, 1)]

有没有办法做到这一点,而不需要在之后把列表压平,或者有没有更好的方法来实现这个?

2 个回答

0

在编程中,有时候我们需要把一些数据从一种格式转换成另一种格式。这就像把一份文件从Word格式转换成PDF格式一样。这个过程可能会涉及到一些特定的规则和步骤,确保转换后的文件能够正常使用。

例如,如果你有一个包含数字和字母的字符串,可能需要把它转换成一个只包含数字的列表。这个过程通常需要用到一些编程技巧,比如循环和条件判断。

在这个过程中,可能会遇到一些问题,比如数据格式不对,或者转换后数据丢失等。这就需要我们仔细检查每一步,确保每个细节都处理得当。

总之,数据转换是编程中常见的任务之一,掌握它可以帮助我们更好地处理和利用数据。

>>> import numpy as np
>>> arr = np.zeros((6,6), np.bool_)
>>> arr[2,3] = True
>>> arr[5,1] = True
>>> np.argwhere(arr)
array([[2, 3],
       [5, 1]])
1

我觉得你想要的功能是 numpy.where。这里有个例子:

>>> import numpy
>>> arr = numpy.zeros((6,6), numpy.bool_)
>>> arr[2,3] = True
>>> arr[5,1] = True
>>> numpy.where(arr)
(array([2, 5]), array([3, 1]))

你可以像这样把它转换回索引:

>>> numpy.array(numpy.where(arr)).T
array([[2, 3],
       [5, 1]])

撰写回答