我有这个数组
import numpy as np
array = np.array([2, 3, 4])
我想把它映射到
[array([ 1., 1., 0., 0., 0.]), array([ 1., 1., 1., 0., 0.]), array([ 1., 1., 1., 1., 0.])]
这是迄今为止我找到的最好的解决方案
def ordinal_array(where_max, array_len=5):
return np.hstack((np.ones((where_max)), np.zeros((array_len-where_max))))
list(map(ordinal_array,[2,3,4]))
但我想知道是否有更好的扩展性,因为我想将其应用于具有几百万个数据点的数组。
最佳答案
杠杆 broadcasting
输入数组的大于 outer-comparison
与 array_len
值的范围 -
In [14]: array
Out[14]: array([2, 3, 4])
In [15]: array_len = 5
In [16]: (array[:,None] > np.arange(array_len)).astype(float)
Out[16]:
array([[1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0.],
[1., 1., 1., 1., 0.]])
内置 NumPy -
In [23]: np.greater.outer(array, np.arange(array_len)).astype(float)
Out[23]:
array([[1., 1., 0., 0., 0.],
[1., 1., 1., 0., 0.],
[1., 1., 1., 1., 0.]])
为了提高性能,请考虑转换为精度较低的 int
或什至将输出保留为 bool 数组(为此跳过 astype 转换)。
关于python - 将数组转换为序数回归编码的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49551271/