Python 替换原始值

Python 替换原始值,python,arrays,numpy,Python,Arrays,Numpy,我有一个numpy数组y,我正试图保存它,但是它被以下操作替换: ys = np.unique(y) y2 = y for i,val in enumerate(ys): y2[y2==val]=i 为什么原始numpy阵列会被此操作替换?最初,ys是1,5,7,在上述操作之后,np.unique(y)给出:0,1,2如前所述,y2=y只是对底层numpy数组进行了另一次引用。就python而言,y2和y是无法区分的。您甚至可以检查y2是否为y将返回True,并且两个数组都具有相同的i

我有一个numpy数组
y
,我正试图保存它,但是它被以下操作替换:

ys = np.unique(y)
y2 = y
for i,val in enumerate(ys):
    y2[y2==val]=i

为什么原始numpy阵列会被此操作替换?最初,
ys
是1,5,7,在上述操作之后,
np.unique(y)
给出:
0,1,2

如前所述,
y2=y
只是对底层numpy数组进行了另一次引用。就python而言,
y2
y
是无法区分的。您甚至可以检查
y2是否为y
将返回
True
,并且两个数组都具有相同的
id
(内存位置)。如注释中所述,您可以制作不共享相同内存地址的
y2
副本
y

y2 = y.copy()
或者(也许更有效),您可以依赖内置的numpy函数。在这种情况下,我认为
numpy.digitalize
可能适合您的需要:

np.digitize(y, np.unique(y)) - 1
看起来很有意思

>>> a = np.array([0, 0, 1, 2, 1, 3, 4, 5, 0, 10, 30])
>>> b = np.digitize(a, np.unique(a)) - 1
>>> b
array([0, 0, 1, 2, 1, 3, 4, 5, 0, 6, 7])

如前所述,
y2=y
只是对底层numpy数组进行另一次引用。就python而言,
y2
y
是无法区分的。您甚至可以检查
y2是否为y
将返回
True
,并且两个数组都具有相同的
id
(内存位置)。如注释中所述,您可以制作不共享相同内存地址的
y2
副本
y

y2 = y.copy()
或者(也许更有效),您可以依赖内置的numpy函数。在这种情况下,我认为
numpy.digitalize
可能适合您的需要:

np.digitize(y, np.unique(y)) - 1
看起来很有意思

>>> a = np.array([0, 0, 1, 2, 1, 3, 4, 5, 0, 10, 30])
>>> b = np.digitize(a, np.unique(a)) - 1
>>> b
array([0, 0, 1, 2, 1, 3, 4, 5, 0, 6, 7])

这是因为当您执行
y2[y2==val]=i
时,您正在操作原始数组y。Python不会复制np数组,除非您像@John Galt提到的那样显式地告诉它。
而不是执行
y2=y
do
y2=y.copy()
。这将创建一个
y
的副本,您将操作副本而不是原始副本。

这是因为当您执行
y2[y2==val]=i
时,您正在操作原始数组y。Python不会复制np数组,除非您像@John Galt提到的那样显式地告诉它。 而不是执行
y2=y
do
y2=y.copy()
。这将创建一个
y
的副本,您将操作副本而不是原始副本。

复制
y2=y.copy()
复制
y2=y.copy()