Python 用新值列表替换NumPy数组值(唯一值的有限集)
如何使以下代码更快?一个大的NumPy阵列需要一个小时Python 用新值列表替换NumPy数组值(唯一值的有限集),python,numpy,Python,Numpy,如何使以下代码更快?一个大的NumPy阵列需要一个小时 i=0 对于np中的y。唯一(y_in): y_in[y_in==y]=i i+=1 e、 g.y_in包含这六个值中的任意一个[0.1,0.22,0.27,0.4,0.51,0.92],我想用1替换所有0.1,用2替换所有0.22,等等。我认为这种行为可以像这样矢量化(假设y_in是1d): y_in=np.数组([0.1,0.22,0.27,0.4,0.51,0.92]) y_in=np.arange(1,y_in.size+1)[n
i=0
对于np中的y。唯一(y_in):
y_in[y_in==y]=i
i+=1
e、 g.y_in包含这六个值中的任意一个[0.1,0.22,0.27,0.4,0.51,0.92],我想用1替换所有0.1,用2替换所有0.22,等等。我认为这种行为可以像这样矢量化(假设
y_in
是1d):
y_in=np.数组([0.1,0.22,0.27,0.4,0.51,0.92])
y_in=np.arange(1,y_in.size+1)[np.unique(y_in,return_inverse=True)[1]]
尤因
输出:
数组([1,2,3,4,5,6])
在中的y\u中具有非唯一值的示例:
y_in=np.数组([0.1,0.22,0.22,0.4,0.4,0.92,0.92,0.92])
y_in=np.arange(1,y_in.size+1)[np.unique(y_in,return_inverse=True)[1]]
尤因
输出:
数组([1,2,2,3,3,4,4])
我认为这种行为可以像这样矢量化(假设y\u in
是1d):
y_in=np.数组([0.1,0.22,0.27,0.4,0.51,0.92])
y_in=np.arange(1,y_in.size+1)[np.unique(y_in,return_inverse=True)[1]]
尤因
输出:
数组([1,2,3,4,5,6])
在
中的y\u中具有非唯一值的示例:
y_in=np.数组([0.1,0.22,0.22,0.4,0.4,0.92,0.92,0.92])
y_in=np.arange(1,y_in.size+1)[np.unique(y_in,return_inverse=True)[1]]
尤因
输出:
数组([1,2,2,3,3,4,4])
numpy.unique
已经做到了:
In [1]: import numpy
In [2]: x = numpy.array([5, 3, 5, 5, 6, 8, 3, 6])
In [3]: y, z = numpy.unique(x, return_inverse=True)
In [4]: z
Out[4]: array([1, 0, 1, 1, 2, 3, 0, 2])
In [5]: y
Out[5]: array([3, 5, 6, 8])
这里,z
是您试图构建的数组。它的速度更快,并且避免了代码中索引可能会更新两次的错误(例如,如果所有2都被6s替换,然后所有6s都被8s替换)。numpy.unique已经做到了这一点:
In [1]: import numpy
In [2]: x = numpy.array([5, 3, 5, 5, 6, 8, 3, 6])
In [3]: y, z = numpy.unique(x, return_inverse=True)
In [4]: z
Out[4]: array([1, 0, 1, 1, 2, 3, 0, 2])
In [5]: y
Out[5]: array([3, 5, 6, 8])
这里,z
是您试图构建的数组。它的速度快得多,并且避免了代码中索引可能被更新两次的错误(例如,如果所有2都被6s替换,然后所有6都被8s替换).你能举一个你正在处理的数据的例子,以及你想用什么值来替换唯一的元素吗?我想你只需要展平数组,然后在一次扫描中分配值,比如:y\u in[y\u in==np.unique(y\u in)]=I
,其中,i
是替换值。你能举个例子说明你正在处理的数据以及你想用什么值替换唯一元素吗?我认为你只需要展平数组,然后在一次扫描中分配值,比如:y_in[y_in==np.unique(y_in)]=i
,其中,i
是替换值。