【问题标题】:numpy map 2D array valuesnumpy 映射二维数组值
【发布时间】:2018-06-10 18:16:47
【问题描述】:

我正在尝试映射 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 像素消耗几 GB 的内存?

谢谢

【问题讨论】:

  • 您为什么不生成您想要的任何内容的列表,然后使用np.array(img_data) 简单地将所有内容转换为np array

标签: python arrays numpy dictionary iteration


【解决方案1】:

也许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 条目,也许有更好的方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-22
    • 2011-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多