我有一个关于在一个numpy数组中取一个元素并在循环中调整它的问题。
基本问题是我有格式(x,y)的时间序列,其中一些元素缺少y值,因此它们被读入程序中的长度为1。
即: [X,Y] [X,Y] [X] [X,Y]
所以我需要采取这些偶然的点并将它们调整为标准(1,2)(然后根据分布生成一个点,但这不是麻烦)。我知道numpy.resize函数,但是当我尝试:
for element in list:
if len(element)==1:
element=n.resize(element,(1,2))
它在循环范围内工作,但如果我打印列表,则所有元素都与循环从未发生过相同。 resize函数返回一个数组,所以我很困惑为什么设置list的元素等于该数组不起作用。
编辑: 我找到了一个使用常规python列表的简单解决方案:
for element in list:
if len(element)==1:
element.append(0)
但我仍然很好奇为什么以上不起作用,因为肯定设置一个等于某事的元素是可能的。或者你只能将元素[i]设置为等于[1,x]数组中的某些东西吗?
答案 0 :(得分:2)
使用element=n.resize(element, (1,2))
,您实际上正在创建一个新对象element
,该对象是旧np.resize
上element
的结果,但是您没有做任何事情使用这个新对象,您的修改就会丢失。
执行element.append(0)
时,您正在修改element
,因此您仍然指的是初始对象,并且您的修改已保存。
也就是说,有更好的方法来处理ndarray
中缺少的元素。正如您所注意到的,如果不是所有这些元素都是两个项目的序列,则无法从(N,2)
元素列表中创建N
数组:您必须以某种方式填补空白。如果您的初始数据来自文本文件,则可以使用np.genfromtxt
和usemask=True
参数创建MaskedArray
:
>>> data = StringIO.StringIO("1,2\n3,4\n,6\n7,\n")
>>> x = np.genfromtxt(data, delimiter=",", usemask=True)
>>> x
masked_array(data =
[[1.0 2.0]
[3.0 4.0]
[-- 6.0]
[7.0 --]],
mask =
[[False False]
[False False]
[ True False]
[False True]],
fill_value = 1e+20)
最初的差距已经填充了特殊的np.ma.masked
值。
答案 1 :(得分:0)
当你说element=...
你没有修改元素引用的对象时,你正在使element
引用一个新对象。当你在元素上调用append
时,你实际上正在修改对象。