我有一个带有两列的结构化numpy数组。一列包含一系列日期时间作为字符串,另一列包含与该日期对应的测量值。
data = array([('date1', 2.3), ('date3', 2.4), ...]
dtype=[('date', '<U16'), ('val', '<f8')])
我还有许多与以下类似的功能:
def example_func(x):
return 5*x + 1
我正在尝试将example_func
应用于我的数组的第二列并生成结果
array([('date1', 12.5), ('date3', 11.6), ...]
dtype=[('date', '<U16'), ('val', '<f8')])
然而,我尝试的所有东西要么从numpy提出未来的警告,要么需要for循环。关于如何有效地做到这一点的任何想法?
答案 0 :(得分:2)
这对我有用:
In [7]: example_func(data['val'])
Out[7]: array([ 12.5, 13. ])
In [8]: data['val'] = example_func(data['val'])
In [9]: data
Out[9]:
array([('date1', 12.5), ('date3', 13. )],
dtype=[('date', '<U16'), ('val', '<f8')])
In [10]: np.__version__
Out[10]: '1.12.0'
我在访问多个字段(带有名称列表)时遇到了未来的警告,然后尝试进行某种修改。它建议制作副本等。但我不能用这样的单一字段访问产生这样的警告。
In [15]: data[['val', 'date']]
Out[15]:
array([( 12.5, 'date1'), ( 13. , 'date3')],
dtype=[('val', '<f8'), ('date', '<U16')])
In [16]: data[['val', 'date']][0] = (12, 'date2')
/usr/local/bin/ipython3:1: FutureWarning: Numpy has detected that you (may be) writing to an array returned
by numpy.diagonal or by selecting multiple fields in a structured
array. This code will likely break in a future numpy release --
see numpy.diagonal or arrays.indexing reference docs for details.
The quick fix is to make an explicit copy (e.g., do
arr.diagonal().copy() or arr[['f0','f1']].copy()).
开发人员对如何一次访问多个字段感到不满意。可以阅读它们,但正在评估变化。在'1.13'中,按位置而不是名称复制字段会有一些变化。