【发布时间】:2021-06-21 09:27:38
【问题描述】:
我正在寻找是否有更有效的方法(即使用本机 NumPy 功能)来实现我目前正在做的事情。
我的流程是从数组a开始:
a = np.array([[0,2,0,-1],[-0.2,0,-0.1,0],[0,0,-0.1,0],[0,0,0,0]])
array([[ 0. , 2. , 0. , -1. ],
[-0.2, 0. , -0.1, 0. ],
[ 0. , 0. , -0.1, 0. ],
[ 0. , 0. , 0. , 0. ]])
然后我根据值不等于0 的位置进行过滤:
r_indices, c_indicies = np.where(a != 0)
(array([0, 0, 1, 1, 2]), array([1, 3, 0, 2, 2]))
从那里,我创建了一个 Python 字典 b,如下所示:
b = {i: c_indices[r_indices == i] for i in np.unique(r_indices)}
{
0: array([1, 3]),
1: array([0, 2]),
2: array([2])},
}
我这样做是因为我想知道对于给定的唯一行索引r,哪些列索引不是 0。
我自己的偏好是尽可能多地尝试使用 NumPy 以利用速度优势。但是,我不确定如何在 NumPy 中构造它,因为字典中的值的长度范围可以从 0(没有值不为零)到 4(所有值都不为零)。
我是否对潜在的速度优势感到偏执?
【问题讨论】:
-
1) 担心速度优势就是用你的时间换取计算机的时间,只有你自己才能决定你更关心谁的时间。 2)您似乎将汇总统计信息存储在一个 numpy 数组中,通常只有几个元素的 numpy 数组不会提供速度优势。 3) 顺便说一句,这可能与您无关,当您使用浮点数时,我会担心像
where(a != 0)这样的行,因为它不会匹配不等于但非常接近于零的值。 -
{r:np.nonzero(a[r]) for r in range(4)}可能更简单,甚至更快。整个数组上的nonzero更快,但是将其分成行并制作字典基本上是一项 Python 任务。在收集大小不同的数组列表或字典时,即使不是不可能,也很难使用整个数组方法。
标签: python arrays numpy dictionary