我想替换由0和1组成的numpy数组中的项目。 我想用列表[0,1]替换1,用列表[1,0]替换0。
我找到了函数numpy.where()
,但它不适用于列表。
是否存在类似于numpy.where(vector==1,[0,1], [1,0])
的函数或类似内容?
答案 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]])