假设您有以下数组:
但是那种方法行不通。为什么行不通?我该如何解决呢?
提前致谢。
In [29]: a = array([[10, 20, 30, 40, 50], [14, 28, 42, 56, 70], [18, 36, 54, 72, 90]])
Out[30]: a
array([[ 0, 0, 0, 0, 0],
[14, 28, 42, 56, 70],
[18, 36, 54, 72, 90]])
现在将第三行除以第一行(使用 future 模块的 division 方法)。
In [32]: a[0]/a[2]
Out[32]: array([ 0.55555556, 0.55555556, 0.55555556, 0.55555556, 0.55555556])
现在可以使用循环语句对每一行进行同样的操作:
In [33]: for i in range(3):
print a[i]/a[2]
[ 0.55555556 0.55555556 0.55555556 0.55555556 0.55555556]
[ 0.77777778 0.77777778 0.77777778 0.77777778 0.77777778]
[ 1. 1. 1. 1. 1.]
一切看起来都没问题。但现在,将第一个数组a[i]/a[2]赋值给a[i]:
In [35]: for i in range(3):
a[i]/=a[2]
....:
In [36]: a
Out[36]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]])
好的,没问题。原来是这是有意设计的。相反,我们应该这样做:
In [38]: for i in range(3):
a[i] = a[i]/a[2]
....:
In [39]: a
Out[39]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1]])
但是那种方法行不通。为什么行不通?我该如何解决呢?
提前致谢。
ndarray
是围绕一个c数组(数据)的包装器。原则上,您只需将ndarray指向新的数据块的指针移动即可从Python的角度执行“就地”操作。例如:a = array(...); b = a; a.magic_type_convert(float); b.dtype is a.dtype #true
。但是,我不知道是否存在该操作。只要“视图”(views)持有对数据的相同引用(我认为它们是),那么也会奏效。 - mgilsonc
最初保存的是int
,那么无论你在等式的右侧放入什么,它始终会保存int
。 - mgilson