numpy map二维数组值

时间:2017-12-30 19:44:33

标签: python arrays numpy dictionary iteration

我试图映射2D numpy数组的值,即迭代(有效)遍历行并根据行索引追加值。

我尝试的方法之一是:

source = misc.imread(fname) # Load some image
img = np.array(source, dtype=np.float64) / 255 # Cast and normalize values
w, h, d = tuple(img.shape) # Get dimensions
img = np.reshape(img, (w * h, d)) # Flatten 3D to 2D

# The actual problem:
# Map (R, G, B) pixels to (R, G, B, X, Y) to preserve position
img_data = ((px[0], px[1], px[2], idx % w, int(idx // w)) for idx, px in enumerate(img))
img_data = np.fromiter(img_data, dtype=tuple) # Get back to np.array

但解决方案提出:ValueError: cannot create object arrays from iterator

有谁能建议如何在numpy中有效地执行这种荒谬简单的操作?我不在乎这个库是多么复杂......为什么那段代码消耗了7000x5000像素的几个内存?

由于

1 个答案:

答案 0 :(得分:0)

可能是np.concatenatenp.indices

np.concatenate((np.arange(40).reshape((4,5,2)), *np.indices((4,5,1))), axis=-1)[:,:,:-1]
Out[264]: 
array([[[ 0,  1,  0,  0],
        [ 2,  3,  0,  1],
        [ 4,  5,  0,  2],
        [ 6,  7,  0,  3],
        [ 8,  9,  0,  4]],

       [[10, 11,  1,  0],
        [12, 13,  1,  1],
        [14, 15,  1,  2],
        [16, 17,  1,  3],
        [18, 19,  1,  4]],

       [[20, 21,  2,  0],
        [22, 23,  2,  1],
        [24, 25,  2,  2],
        [26, 27,  2,  3],
        [28, 29,  2,  4]],

       [[30, 31,  3,  0],
        [32, 33,  3,  1],
        [34, 35,  3,  2],
        [36, 37,  3,  3],
        [38, 39,  3,  4]]])  

[:,:,:-1]删除了额外的' 0条目,也许有更好的方法