【问题标题】:Efficient operation on numpy arrays contain rows with different size对 numpy 数组的高效操作包含不同大小的行
【发布时间】:2019-10-24 08:04:44
【问题描述】:

我想问一些与此问题相关的问题 Operation on numpy arrays contain rows with different size 。关键是我需要对包含不同大小行的 numpy 数组进行一些操作。

像“list2*list3*np.exp(list1)”这样的标准方法不起作用,因为行的大小不同,而有效的选项是使用 zip。请参阅下面的代码。

import numpy as np
import time

list1 = np.array([[2.,0.,3.5,3],[3.,4.2,5.,7.1,5.]])
list2 = np.array([[2,3,3,0],[3,8,5.1,7.6,1.2]])
list3 = np.array([[1,3,8,3],[3,4,9,0,0]])

start_time = time.time()

c =[]
for i in range(len(list1)):
    c.append([list2*list3*np.exp(list1) for list1, list2,list3 in zip(list1[i], list2[i],list3[i])])

print("--- %s seconds ---"% (time.time()-start_time))

我想问是否存在一种更有效的方法来执行此操作,从而避免循环并以更 numpy 的方式进行操作。谢谢!

【问题讨论】:

  • 让它们具有特定形状的目的是什么?在函数中调整形状以便可以一次性完成乘法是否有问题?

标签: python arrays numpy


【解决方案1】:

应该这样做:

f = np.vectorize(lambda x, y, z: y * z * np.exp(x))

result = [f(*i) for i in np.column_stack((list1, list2, list3))]

result

#[array([ 14.7781122 ,   9.        , 794.77084701,   0.        ]),
# array([ 180.76983231, 2133.96259331, 6812.16400281,    0.        ,    0.        ])]

【讨论】:

  • 这样更快吗?
  • @Joe 没错,在很多情况下循环更快。另外,essentially a for loop 如注释所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 2018-10-01
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多