将除法除以n numpy

时间:2016-05-30 20:00:30

标签: python performance numpy matrix

我通过矩阵逐点除法做矩阵但是除数矩阵中有一些零。这导致警告和一些NaN。我希望这些映射到0,我可以这样做:

CREATE TRIGGER trigger_name
AFTER INSERT
   ON price FOR EACH ROW
BEGIN
   UPDATE Price SET Total = SUM(Units * Price_per_unit) where id=(select id from price order by id limit 1); 
END;

然而,这有两个问题,首先它仍然发出警告(我不喜欢警告),其次这需要第二次通过矩阵(不确定这是否是不可避免的)并且效率是对于这部分代码非常重要。想法?

2 个答案:

答案 0 :(得分:4)

这可能是最快的解决方案,但where函数会在预先计算解决方案时触发错误:

import numpy as np

n = 4

xy = np.random.randint(4, size=(n,n)).astype(float)
x_norm = np.random.randint(4, size=(n,n)).astype(float)
y_norm = np.random.randint(4, size=(n,n)).astype(float)

xy_norm = x_norm*y_norm

edge_map = np.where(xy_norm == 0, xy_norm, xy/xy_norm)

print(xy)
print(xy_norm)
print(edge_map)

答案 1 :(得分:0)

尽管Chiel的解决方案适用于本示例,但由于npm uninstall @google-cloud/datastore并不懒惰,因此解决方案可能会变得昂贵。您必须为所有参数计算可能的输出np.wherexy_norm。如果不希望这样,您可以只计算输出,通常需要多几行:

xy/xy_norm

在这里,我们避免对import numpy as np n = 4 xy = np.random.randint(4, size=(n,n)).astype(float) x_norm = np.random.randint(4, size=(n,n)).astype(float) y_norm = np.random.randint(4, size=(n,n)).astype(float) xy_norm = x_norm*y_norm edge_map = np.zeros_like(xy_norm) non_zero = xy_norm != 0 edge_map[non_zero] = xy[non_zero]/xy_norm[non_zero] print(xy) print(xy_norm) print(edge_map) 为零的所有元素进行除法。由于通常很少有零,并且除法并不是非常昂贵,因此从性能角度来看,这可能不值得。 或者,您可以更改

xy_norm

edge_map[non_zero] = xy[non_zero]/xy_norm[non_zero]

以防您感到可读性更高(see this)。