我有一个二维数组
X
array([[2, 3, 3, 3],
[3, 2, 1, 3],
[2, 3, 1, 2],
[2, 2, 3, 1]])
和一维数组
y
array([1, 0, 0, 1])
对于X的每一行,我想找到X值为最低且y值为1的列索引,并将第三矩阵中对应的行列对设置为1
例如,在X的第一行的情况下,对应于最小X值(仅对于第一行)且y = 1的列索引为0,则我希望Z [0,0] = 1并所有其他Z [0,i] = 0。 类似地,对于第二行,列索引0或3给出了y = 1的最低X值。然后我希望Z [1,0]或Z [1,3] = 1(最好Z [1,0] = 1,所有其他Z [1,i] = 0,因为第一个出现0列)
我最后的Z数组看起来像
Z
array([[1, 0, 0, 0],
[1, 0, 0, 0],
[1, 0, 0, 0],
[0, 0, 0, 1]])
答案 0 :(得分:2)
一种方法是使用屏蔽数组。
import numpy as np
X = np.array([[2, 3, 3, 3],
[3, 2, 1, 3],
[2, 3, 1, 2],
[2, 2, 3, 1]])
y = np.array([1, 0, 0, 1])
#get a mask in the shape of X. (True for places to ignore.)
y_mask = np.vstack([y == 0] * len(X))
X_masked = np.ma.masked_array(X, y_mask)
out = np.zeros_like(X)
mins = np.argmin(X_masked, axis=0)
#Output: array([0, 0, 0, 3], dtype=int64)
#Now just set the indexes to 1 on the minimum for each axis.
out[np.arange(len(out)), mins] = 1
print(out)
[[1 0 0 0]
[1 0 0 0]
[1 0 0 0]
[0 0 0 1]]
答案 1 :(得分:0)
您可以使用numpy.argmin()
来获取X
每行的最小值索引。例如:
import numpy as np
a = np.arange(6).reshape(2,3) + 10
ids = np.argmin(a, axis=1)
类似地,您可以使用numpy.nonzero
或numpy.where
来索引y为1的索引。
一旦有了两个索引数组,就可以很容易地在第三个数组中设置值。