基于逐元素函数,将一维的numpy数组映射到二维数组。

3

我有一个numpy数组,它的形状为shape=(10000,)。以下是前5个条目:

labels = data[:, 0]
print(labels.shape)
print(labels[0:5])

# prints 
# (100000,)
# [1. 1. 1. 0. 1.]

每个条目都是0或1。我想将其映射到一个2D数组中,通过逐元素操作进行映射。
0 -> [1, 0]
1 -> [0, 1]

我该如何做到这一点?我已经尝试过

labels = np.apply_along_axis(lambda x: [1, 0] if x[0] == 0 else [0, 1], 0, data[:, 0])

但是那似乎没有起作用。

将来,如果您遇到这样的问题卡住了,您总是可以按照愚蠢的方式做事——构建每一列(“1-labels”和“labels”)并将它们堆叠。当然,您可以暂时这样做,以便您可以继续进行代码的下一步,同时等待看看其他人是否有更好的答案在 SO 上。 - abarnert
3个回答

2
In [435]: ref = np.array([[1,0],[0,1]])
In [436]: index = np.array([1.,1.,1.,0.,1.])

使用浮点数进行索引在最近的版本中会出现错误:

In [437]: ref[index,:]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-437-d50c95668d6c> in <module>()
----> 1 ref[index,:]

IndexError: arrays used as indices must be of integer (or boolean) type

使用整数进行索引,在ref中根据index值选择行:

In [438]: ref[index.astype(int),:]
Out[438]: 
array([[0, 1],
       [0, 1],
       [0, 1],
       [1, 0],
       [0, 1]])

这是一个应该使用 choose 的情况,但它对数组的形状更为挑剔,与上述索引方式不同:
In [440]: np.choose(index.astype(int)[:,None],[[1,0],[0,1]])
Out[440]: 
array([[0, 1],
       [0, 1],
       [0, 1],
       [1, 0],
       [0, 1]])

如果只有两个转换为布尔值的选择,可以使用where

In [443]: np.where(index.astype(bool)[:,None],[0,1],[1,0])
Out[443]: 
array([[0, 1],
       [0, 1],
       [0, 1],
       [1, 0],
       [0, 1]])

1
你可以尝试以下内容。
labels = np.array([1,1,1,0,1])
np.eye(np.max(labels) + 1)[labels]

这句话的意思是:

array([[ 0.,  1.],
       [ 0.,  1.],
       [ 0.,  1.],
       [ 1.,  0.],
       [ 0.,  1.]])

0

该方法对原始数组执行异或操作,并将两个数组堆叠在一起。

labels = np.random.randint(0,2, 10000)
# array([0, 0, 1, ..., 1, 1, 0])
np.vstack([(~labels.astype(bool)).astype(int), labels])
array([[1, 1, 0, ..., 0, 0, 1],
       [0, 0, 1, ..., 1, 1, 0]])

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