Numpy分配行为

时间:2016-11-10 10:59:24

标签: python numpy

b

array([-0.06106568, -0.10843541, -0.0694688 ,  0.02464023, -0.03686665,
       -0.0582096 , -0.13476669, -0.08505708,  0.00391955, -0.12300518,
       -0.01183732, -0.05374973, -0.12300518, -0.05312849,  0.01963862,
        0.00155719, -0.10843541, -0.08490177, -0.08505708, -0.02026149,
       -0.01777489,  0.01183732, -0.11575136,  0.04278603, -0.0694688 ,
       -0.06106568, -0.08755022, -0.01660802, -0.06087603, -0.06582411])

a = b
a[a <= 0] = 0
a[a > 0] = 1

使用上面的代码我想替换a中的元素,但是b也会改变...你能解释一下我的错误在哪里吗?

3 个答案:

答案 0 :(得分:3)

通过使用表达式a = b,您实际上将引用复制到b。如果您想复制其值,则应该浏览所有b项并将其值复制到a

在numpy中你应该使用copy函数。

>>> import numpy
>>> b = numpy.array([-0.06106568, -0.10843541, -0.0694688 ,  0.02464023, -0.03686665,
...        -0.0582096 , -0.13476669, -0.08505708,  0.00391955, -0.12300518,
...        -0.01183732, -0.05374973, -0.12300518, -0.05312849,  0.01963862,
...         0.00155719, -0.10843541, -0.08490177, -0.08505708, -0.02026149,
...        -0.01777489,  0.01183732, -0.11575136,  0.04278603, -0.0694688 ,
...        -0.06106568, -0.08755022, -0.01660802, -0.06087603, -0.06582411])
>>> a = numpy.copy(b)
>>> a
array([-0.06106568, -0.10843541, -0.0694688 ,  0.02464023, -0.03686665,
       -0.0582096 , -0.13476669, -0.08505708,  0.00391955, -0.12300518,
       -0.01183732, -0.05374973, -0.12300518, -0.05312849,  0.01963862,
        0.00155719, -0.10843541, -0.08490177, -0.08505708, -0.02026149,
       -0.01777489,  0.01183732, -0.11575136,  0.04278603, -0.0694688 ,
       -0.06106568, -0.08755022, -0.01660802, -0.06087603, -0.06582411])
>>> a[a<= 0] = 0
>>> a[a> 0] = 1
>>> a
array([ 0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,
        0.,  1.,  1.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  1.,  0.,  0.,
        0.,  0.,  0.,  0.])
>>> b
array([-0.06106568, -0.10843541, -0.0694688 ,  0.02464023, -0.03686665,
       -0.0582096 , -0.13476669, -0.08505708,  0.00391955, -0.12300518,
       -0.01183732, -0.05374973, -0.12300518, -0.05312849,  0.01963862,
        0.00155719, -0.10843541, -0.08490177, -0.08505708, -0.02026149,
       -0.01777489,  0.01183732, -0.11575136,  0.04278603, -0.0694688 ,
       -0.06106568, -0.08755022, -0.01660802, -0.06087603, -0.06582411])

有一些本地方法可以做到,但如果你使用数学,强烈建议只使用numpy。

<强>更新

我不会想到任何非笨拙的方式,这会导致与你的案件完全兼容。

答案 1 :(得分:1)

当您执行a=b后,您将b命名为参考,因此ab是同一对象的视图,如果您想要副本,请使用{ {1}}:

np.copy

答案 2 :(得分:0)

你实际上只是指向一个b,它们都包含相同的列表。基本上python变量是赋予对象的名称。您想在此处创建包含新列表的新对象。你有很多选择:

您可以使用内置的list()功能:

a = list(b)

或者您可以导入copy并使用它。

import copy
a = copy.copy(b)

或在numpy的情况下:

import numpy
a = np.copy(b)