Numpy和2-d数组差异

时间:2014-12-20 19:15:02

标签: python arrays numpy

到目前为止,我做我想做的事情如下

ar2 = [[0 for t in range(maxy-miny)] for t in range(maxx-minx)]

for first,x in enumerate(range(minx, maxx)):
    for second,y in enumerate(range(miny, maxy)):
        ar2[first][second] = a[x][y]

io.imshow(ar2)

问题在于它真的很慢。所以我正在考虑numpy。

ar = np.zeros((maxx-minx, maxy-miny), dtype=np.ndarray) 

for first,x in enumerate(range(minx, maxx)):
    for second,y in enumerate(range(miny, maxy)):
        ar[first][second] = a[x][y] 

io.imshow(ar)

虽然在第二种情况下,图像不会显示

TypeError: Image data can not convert to float

我试图检查可能发生的事情,所以我测试了ar [0]& AR2 [0]

二维数组的输出:

  

[array([230,197,204],dtype = uint8)   数组([241,209,214],   D型= UINT8)
  数组([233,201,206],dtype = uint8)数组([214,183,   188],dtype = uint8)...

Numpy数组的输出:

  

[array([230,197,204] dtype = uint8),   数组([241,209,214] dtype = uint8),

     

数组([233,201,206],dtype = uint8),...

显然,numpy正在使用逗号,但我无法理解它是如何以及为什么会发生。

1 个答案:

答案 0 :(得分:1)

您使用的dtype不是类似数字的有效类型,您使用np.ndarray作为数组中各个值的类型。

import matplotlib.pyplot as plt
import numpy as np

ar = np.zeros((maxx-minx, maxy-miny))
a = plt.imread('something.jpg')

for first,x in enumerate(range(minx, maxx)):
    for second,y in enumerate(range(miny, maxy)):
        ar[first][second] = a[x][y] 

plt.imshow(ar)

这应该有效 - 但是你还没有提供足够的信息来可靠地测试它。

我还建议使用plt作为matplotlib.pyplot的缩写,而不是io,这很容易与实际的io模块混在一起。

但是,您可以实现相同的目标,但根本不能循环:

ar3[0:maxx-minx, 0:maxy-miny] = a[minx:maxx,miny:maxy]
np.allclose(ar2, ar3)  # True