我通过矩阵逐点除法做矩阵但是除数矩阵中有一些零。这导致警告和一些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;
然而,这有两个问题,首先它仍然发出警告(我不喜欢警告),其次这需要第二次通过矩阵(不确定这是否是不可避免的)并且效率是对于这部分代码非常重要。想法?
答案 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.where
和xy_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)。