如何迭代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
答案 0 :(得分:0)
表达式如下:
for row in daily_ret:
daily_ret[row] = ((cumu_ret[row]/1000) - 1)
row
是daily_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
是过度的。在尝试编写cython
或c
版本的方法时很有用,但通常不需要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_ret
和cumu_ret
。
让nditer
遍历数组的一个维度也很棘手。默认情况下,它逐个元素地迭代。
这提出了一个问题 - 你为什么要首先进行迭代。为什么不呢:
daily_ret = cumu_ret/1000. - 1
我没有详细研究过你的代码,因此不能确定你想要的是什么。