在python中操作数组

2024-09-27 07:30:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个numpy数组,它是通过读取图像获得的。你知道吗

data=band.ReadAsArray(0,0,rows,cols)

现在的问题是,在使用循环操作数据时,大约需要13分钟。如何减少这一时间。还有别的解决办法吗。你知道吗

样本代码

for i in range(rows):
     for j in range(cols):
          if data[i][j]>1 and data[i][j]<30:
                 data[i][j]=255
          elif data[i][j]<1:
                  data[i][j]=0
          else:
              data[i][j]=1

时间太长了。任何简短的方法


Tags: 数据代码in图像numpyfordataband
2条回答

您可以使用布尔数组来指定要更改的值,而不是循环。例如,如果我们有一个数组

>>> a = np.array([[0.1, 0.5, 1], [10, 20, 30], [40, 50, 60]])
>>> a
array([[  0.1,   0.5,   1. ],
       [ 10. ,  20. ,  30. ],
       [ 40. ,  50. ,  60. ]])

我们可以用你的逻辑

>>> anew = np.empty_like(a)
>>> anew.fill(1)
>>> anew[a < 1] = 0
>>> anew[(a > 1) & (a < 30)] = 255
>>> anew
array([[   0.,    0.,    1.],
       [ 255.,  255.,    1.],
       [   1.,    1.,    1.]])

这是因为numpy索引是如何工作的:

>>> a < 1
array([[ True,  True, False],
       [False, False, False],
       [False, False, False]], dtype=bool)
>>> anew[a < 1]
array([ 0.,  0.])

注意:我们并不需要anew您可以对a本身进行操作,但是您必须注意应用程序的顺序,以防您的条件和目标值重叠。你知道吗

注意#2:你的条件意味着如果数组中有一个元素正好是30或更大的值,它将变成1,而不是255。这似乎有点奇怪,但这是你的代码所做的,所以我复制了它。你知道吗

使用numpy可以使用掩码来选择具有特定条件的所有元素,如下面的代码示例所示:

import numpy as np

a = np.random.random((5,5))
a[a<0.5] = 0.0

print(a)
# [[ 0.          0.94925686  0.8946333   0.51562938  0.99873065]
#  [ 0.          0.          0.          0.          0.        ]
#  [ 0.86719795  0.          0.8187514   0.          0.72529116]
#  [ 0.6036299   0.9463493   0.78283466  0.6516331   0.84991734]
#  [ 0.72939806  0.85408697  0.          0.59062025  0.6704499 ]]

如果您希望重新编写代码,那么可以是:

data=band.ReadAsArray(0,0,rows,cols)
data[data >= 1 & data<30] = 255
data[data<1] = 0

相关问题 更多 >

    热门问题