有这段代码,我正试图优化。 它使用列表理解和工作。在
series1 = np.asarray(range(10)).astype(float)
series2 = series1[::-1]
ntup = zip(series1,series2)
[['', 't:'+str(series2)][series1 > series2] for series1,series2 in ntup ]
#['', '', '', '', '', 't:4.0', 't:3.0', 't:2.0', 't:1.0', 't:0.0']
正在尝试在此处使用np.where()
。是否有numpy
的解决方案。(不消耗系列)
结果是:
array(['', '', '', '', '', 't:[ 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.]',
't:[ 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.]',
't:[ 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.]',
't:[ 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.]',
't:[ 9. 8. 7. 6. 5. 4. 3. 2. 1. 0.]'],
dtype='|S43')
我们可以使用基于
^{} 表示用有效字符串附加
't:'
的字符串,并且^{} 根据条件语句选择并执行追加操作,或仅使用空字符串的默认值。
所以,我们会有这样的实现-
加油!
我们可以在基于
series1>series2
掩码的有效元素上使用np.core.defchararray.add
附加np.core.defchararray.add
来进一步提高性能,然后用默认的空字符串初始化一个数组,然后只将有效值赋给它。在所以,修改后的版本应该是这样的-
^{pr2}$运行时测试
矢量化版本作为函数:
在更大的数据集上计时-
正如^{} 所指出的那样,我们可能可以在追加之前先处理
series2
的数据类型。因此,我在那里使用U32
来保持输出数据类型与str
dtype相同,即np.core.defchararray.add
调用中的series2.astype('U32')
。矢量化方法的新计时是-所以,有一些进一步的边际改善!在
你的列表理解只适用于列表,而不是真正需要使用数组。对于这样的操作,阵列可能不会带来任何速度优势。在
正如@Divaker所指出的,
np.char.add
函数将执行字符串操作。我的经验是,它们比列表操作稍微快一些。如果考虑到创建阵列的开销,它们可能会慢一些。在=======
@Divakar显示的
^{pr2}$array
版本几个时间测试:
这对我有用。完全矢量化。在
相关问题 更多 >
编程相关推荐