将整数类型的Numpy数组转换为数组类型的Numpy数组

4
我想将numpy数组转换为numpy数组的数组。
我有一个数组:a = [[0,0,0],[0,255,0],[0,255,255],[255,255,255]]
我想要得到:b = [[[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[255,255,255],[0,0,0]],[[0,0,0],[255,255,255],[255,255,255]],[[255,255,255],[255,255,255],[255,255,255]]]
是否有任何简单的方法可以实现?
我已经尝试使用np.where(a == 0, [0,0,0],[255,255,255]),但是我得到了以下错误:
ValueError: operands could not be broadcast together with shapes

替换值的规则是什么? - seralouk
如果你只是在复制,这个链接很相关:https://dev59.com/LVwY5IYBdhLWcg3w0KrL. - Divakar
3个回答

4

您可以使用broadcast_to作为

b = np.broadcast_to(a, (3,4,3))

假设 a 是形状为 (3,4) 的数组。那么你需要交换这些轴。

import numpy as np
a = np.array([[0,0,0],[0,255,0],[0,255,255],[255,255,255]])
b = np.broadcast_to(a, (3,4,3))
c = np.moveaxis(b, [0,1,2], [2,0,1])
c

提供

array([[[  0,   0,   0],
        [  0,   0,   0],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [255, 255, 255],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]])

@Divakar提出的一种更为直接的广播方法是:
 b = np.broadcast(a[:,:,None], (4,3,3))

这将在不交换轴的情况下生成相同的输出。


不错的想法。通过在前面扩展维度,然后进行广播,可以更快地实现缩短:np.broadcast_to(a[:,:,None], (4,3,3)) - Divakar

2
你所尝试的方法需要进行小幅修改才能生效:
a = np.array(a)
np.where(a[...,None]==0,[0,0,0],[255,255,255])

为了使多维索引可用,我们首先需要将a转换为arraya[...,None]a的末尾添加一个新的维度,以容纳三元组0,0,0和255,255,255。

@makis 我添加了一点解释。 - Paul Panzer

1
In [204]: a = np.array([[0,0,0],[0,255,0],[0,255,255],[255,255,255]])           
In [205]: a.shape                                                               
Out[205]: (4, 3)

看起来你想要将每个元素复制3次,创建一个新的尾维度。我们可以使用repeat来实现(在添加新的尾维度后):

In [207]: a.reshape(4,3,1).repeat(3,2)                                          
Out[207]: 
array([[[  0,   0,   0],
        [  0,   0,   0],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [255, 255, 255],
        [  0,   0,   0]],

       [[  0,   0,   0],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]])
In [208]: _.shape                                                               
Out[208]: (4, 3, 3)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接