在Python中将函数应用于结构化numpy数组的单列

时间:2017-04-02 19:49:55

标签: python arrays numpy

我有一个带有两列的结构化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循环。关于如何有效地做到这一点的任何想法?

1 个答案:

答案 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'中,按位置而不是名称复制字段会有一些变化。