2 回答

TA貢獻1829條經驗 獲得超13個贊
行中負數的索引,也是非填充元素的長度,最簡單的方法是
lengths = np.argmin(numArray, axis=1)
這假定行內所有元素的填充數相同。對于沒有負數的行,這將無法正常工作,因此您可以使用以下方法修復它:
lengths[np.take_along_axis(numArray, lengths.reshape(-1, 1), axis=1).ravel() >= 0] = numArray.shape[1]
您現在可以使用此信息在您的行中生成一個隨機索引數組:
indices = np.random.randint(lengths)
并應用索引獲取相應的元素:
result = np.take_along_axis(numArray, indices.reshape(-1, 1), axis=1)
雖然清理lengths
數組可能是更快的選擇,但更短的表達式可能類似于
lengths = np.where(np.any(numArray < 0, axis=1), np.argmin(numArray, axis=1), numArray.shape[1])
此外,如果您的填充數不是一致的負數,您將需要替換np.argmin(numArray, axis=1)
為np.argmax(numArray < 0, axis=1)
, 或np.argmin(numArray >= 0, axis=1)
,無論您使用哪種方法計算lengths
。

TA貢獻1794條經驗 獲得超7個贊
注意——這可能與@Mad 的回答重疊;我會留下它,以防備選解釋消除一些混亂。
In [32]: numList = [[0, 32, 84, 93, 1023, -1], [0, 23, 33, 45, -1, -1], [0, 10, 15, 21, 2
...: 4, 25], [0, 23, -1, -1, -1, -1], [0 , 13, 33, 34, -1, -1]]
...: numArray = np.array(numList)
In [33]: numArray
Out[33]:
array([[ 0, 32, 84, 93, 1023, -1],
[ 0, 23, 33, 45, -1, -1],
[ 0, 10, 15, 21, 24, 25],
[ 0, 23, -1, -1, -1, -1],
[ 0, 13, 33, 34, -1, -1]])
每行焊盤數:
In [34]: np.sum(numArray==-1, axis=1)
Out[34]: array([1, 2, 0, 4, 2])
每行非填充數:
In [35]: np.sum(numArray!=-1, axis=1)
Out[35]: array([5, 4, 6, 2, 4])
我不知道假設填充值都在最后是否會使它更有效率。樣本有點小,無法把握好時機。
從每一行中隨機選擇一個非填充,顯而易見的第一次嘗試是行列表理解:
In [40]: [np.random.choice(row[row!=-1]) for row in numArray]
Out[40]: [32, 0, 0, 23, 34]
或者從長度(上面)開始工作(并假設尾部填充)我們可以為每一行選擇一個隨機索引:
In [46]: [np.random.choice(i) for i in Out[35]]
Out[46]: [1, 2, 1, 0, 1]
In [47]: numArray[np.arange(numArray.shape[0]), [np.random.choice(i) for i in Out[35]]]
Out[47]: array([93, 45, 21, 23, 13])
在@Mad 的帽子提示中,randint接受范圍值的列表/數組,choice理解可以替換為:
In [49]: np.random.randint(Out[35])
Out[49]: array([3, 1, 2, 1, 1])
In [50]: numArray[np.arange(numArray.shape[0]), np.random.randint(Out[35])]
Out[50]: array([ 0, 23, 24, 0, 0])
添加回答
舉報