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])
添加回答
举报