迭代dtype的ddarray:float?

时间:2015-11-07 04:33:10

标签: python numpy

如何迭代dtype =“float”的数组的选择行?

参数x以及传递给函数的原因:

In [8]: x = np.array([[2000,2000,2000,0,2000,2000,2000,2000,0,2000],[1400,200,1200,1000,600,1600,800,800,1200,600],[1000,780,960,940,860,980,960,860,880,1120],[1016,982,1030,992,978,958,932,980,1040,966]])
In [9]: print x
[[2000 2000 2000    0 2000 2000 2000 2000    0 2000]
 [1400  200 1200 1000  600 1600  800  800 1200  600]
 [1000  780  960  940  860  980  960  860  880 1120]
 [1016  982 1030  992  978  958  932  980 1040  966]]

In [10]: y = 4
In [11]: print y
4

我的功能:我已经尝试了这个版本,但真正的目标是在for循环中迭代什么。我试过,范围(行),nditer()等,我想了解在ndarray上逐行迭代的最佳实践是什么?并且,更进一步,如何选择性地执行它,即当数组是dtype =“float”时只有第0行和第3行?目前,我收到以下错误。

def func(x,y):
    rows, columns = len(x), y
    daily_ret = np.zeros((rows,columns),dtype=float)
    for i in daily_ret:
        daily_ret[i] = (x[i]/1000) - 1
    print daily_ret

我的错误:

In [23]: func(x,y)
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-23-2d375b80632e> in <module>()
----> 1 func(x,y)

<ipython-input-22-e1b1d4ace166> in func(x, y)
      3     daily_ret = np.zeros((rows,columns),dtype=float)
      4     for i in daily_ret:
----> 5         daily_ret[i] = (x[i]/1000) - 1
      6     print daily_ret

IndexError: arrays used as indices must be of integer (or boolean) type

In [24]: k = x/1000

1 个答案:

答案 0 :(得分:0)

表达式如下:

for row in daily_ret: 
    daily_ret[row] = ((cumu_ret[row]/1000) - 1)

rowdaily_ret的元素。如果daily_ret是2d数组,则row是1d数组,是2d的一行。它是索引,不能这样使用。 daily_ret[row]是错误的,cumu_ret[row]也是错误的。

可能的迭代是:

for i in range(daily_ret.shape[0]):
    daily_ret[i] = ((cumu_ret[i]/1000.) -1)

其中i逐步执行0,1,...和daily_ret[i]daily_ret[i,:]的缩写是数组的一行。

或者

for i, row in enumerate(daily_ret):
      row = ((cumu_ret[i]/1000.) - 1)

enumerate是获取元素及其索引的常用Python方法。

在这种情况下使用nditer是过度的。在尝试编写cythonc版本的方法时很有用,但通常不需要Python级迭代。它并不快。

    for i in np.nditer(daily_ret, flags=['buffered'], 
        op_dtypes=['float'], casting='same_kind'):
        i[...] = ((cumu_ret[i]/1000) - 1)

它与for row in daily_ret有同样的问题。这里i是数组的元素,而不是索引。所以它不能在cumu_ret[i]中使用。有一种方法可以使nditer返回一个索引。或者nditer可以设置为迭代daily_retcumu_ret

nditer遍历数组的一个维度也很棘手。默认情况下,它逐个元素地迭代。

这提出了一个问题 - 你为什么要首先进行迭代。为什么不呢:

 daily_ret = cumu_ret/1000. - 1

我没有详细研究过你的代码,因此不能确定你想要的是什么。