用列表替换numpy数组中的项目

时间:2018-01-15 15:03:03

标签: python arrays python-2.7 numpy

我想替换由0和1组成的numpy数组中的项目。 我想用列表[0,1]替换1,用列表[1,0]替换0。

我找到了函数numpy.where(),但它不适用于列表。 是否存在类似于numpy.where(vector==1,[0,1], [1,0])的函数或类似内容?

5 个答案:

答案 0 :(得分:2)

简单的索引应该完成这项工作:

In [156]: x = np.array([0,1,0,0,1,1,0])
In [157]: y = np.array([[1,0],[0,1]])
In [158]: y[x]
Out[158]: 
array([[1, 0],
       [0, 1],
       [1, 0],
       [1, 0],
       [0, 1],
       [0, 1],
       [1, 0]])

只是为了确保这是一个通用的解决方案,而不是一些'布尔'侥幸

In [162]: x = np.array([0,1,0,0,1,2,2])
In [163]: y = np.array([[1,0],[0,1],[1,1]])
In [164]: y[x]
Out[164]: 
array([[1, 0],
       [0, 1],
       [1, 0],
       [1, 0],
       [0, 1],
       [1, 1],
       [1, 1]])

答案 1 :(得分:1)

如果您愿意,可以实际使用where

>>> import numpy as np
>>> vector = np.random.randint(0, 2, (8, 8))
>>> vector
array([[1, 0, 0, 0, 0, 0, 1, 1],
       [1, 1, 0, 1, 0, 0, 0, 1],
       [1, 0, 0, 1, 1, 1, 0, 0],
       [1, 0, 1, 1, 0, 0, 0, 0],
       [0, 1, 0, 1, 1, 1, 1, 1],
       [1, 0, 1, 1, 0, 0, 0, 0],
       [0, 1, 1, 0, 1, 1, 0, 0],
       [1, 1, 1, 1, 1, 1, 0, 0]])
>>> np.where(vector[..., None] == 1, [0,1], [1,0])
# btw. if vector has only 0 and 1 entries you can leave out the " == 1 "
array([[[0, 1],
        [1, 0],
        [1, 0],
        [1, 0],
        [1, 0],
        [1, 0],
        [0, 1],
        [0, 1]],

       [[0, 1],
        [0, 1],
        [1, 0],
        [0, 1],
        [1, 0],
        [1, 0],
        [1, 0],

        etc.

答案 2 :(得分:0)

您希望制作one-hot vector encoding

a = np.array([1, 0, 1, 1, 0])  # initial array
b = np.zeros((len(a), 2))  # where 2 is number of classes
b[np.arange(len(a)), a] = 1
print(b)

结果:

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

答案 3 :(得分:0)

由于无法在NumPy中动态增长数组,您可以将数组转换为列表,根据需要进行替换,然后将结果转换回来到NumPy数组如:

In [21]: vector = np.array([0, 0, 1, 0, 1])

In [22]: vlist = vector.tolist()

In [23]: vlist
Out[23]: [0, 0, 1, 0, 1]

In [24]: new_list = [[1, 0] if el == 0 else [0, 1] for idx, el in enumerate(vlist)]

In [25]: result = np.array(new_list)

In [26]: result
Out[26]: 
array([[1, 0],
       [1, 0],
       [0, 1],
       [1, 0],
       [0, 1]])

如果你的一维数组不够大,那么列表理解并不是一种方法。

答案 4 :(得分:0)

hpaulj的回答将是理想的做法。另一种方法是重塑原始的numpy数组,并应用标准的np.where()操作。

import numpy as np

x = np.array([0,1,0,0,1,1,0])
x = np.reshape(x,(len(x),1))
# Equivalently, if you want to be explicit:
# x = np.array([[e] for e in x])
print np.where(x==1,[1,0],[0,1])
# Result:
array([[0, 1],
       [1, 0],
       [0, 1],
       [0, 1],
       [1, 0],
       [1, 0],
       [0, 1]])