2

我有一个关于在 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 函数返回一个数组,所以我很困惑为什么将列表的元素设置为等于该数组不起作用。

编辑:我找到了一个使用常规 python 列表的简单解决方案:

for element in list:
    if len(element)==1:
       element.append(0)

但是我仍然很好奇为什么上面的方法不起作用,因为当然可以设置一个等于某物的元素。或者你只能设置 element[i] 等于 [1,x] 数组中的某个值吗?

4

2 回答 2

2

使用element=n.resize(element, (1,2)),您实际上是在创建一个新对象,它是旧对象element的结果,但是由于您没有对这个新对象做任何事情,因此您的修改会丢失。np.resizeelement

当您这样做时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价值所填补。

于 2012-09-28T08:13:58.767 回答
0

当您说element=...您没有修改元素引用的对象时,您正在element引用一个新对象。当您调用append元素时,您实际上是在修改对象。

于 2012-09-28T00:17:54.233 回答