numpy 二位数组过滤掉指定条件元素

2019-12-10 13:45:55 +08:00
 sunhk25
    t = np.asarray([[2,3,4],[1,2,3],[1,0,4],[4,5,6]])
    # 删除大于等于 4 的元素:保留二维数组但是不需要保留矩阵结构
    # 希望结果:[[4], [], [4], [4, 5, 6]]

    t[t >= 4]
    # 可以删除但是结果为一维
    # array([4, 4, 4, 5, 6])

    np.where(t >= 4, t, 0)
    # 不需要的元素( 0 )大量占用内存
    #array([[0, 0, 4],
    #       [0, 0, 0],
    #       [0, 0, 4],
    #       [4, 5, 6]])
3515 次点击
所在节点    Python
4 条回复
epleone
2019-12-10 14:39:38 +08:00
如果 a = [[4], [], [4], [4, 5, 6]], 那么 a.shape ?
也许你需要稀疏矩阵,或者说说你这个需求是用来实现什么。
CrazyRundong
2019-12-10 15:56:29 +08:00
```python
from scipy.sparse import coo_matrix

# ...

t[t > 4] = 0
coo_t = coo_matrix(t)
```

稀疏矩阵和稠密矩阵有不同的存储方式。如果不知道矩阵的 pattern,那就用 corrdicate based index 存储吧
CrazyRundong
2019-12-10 15:57:53 +08:00
necomancer
2019-12-11 15:48:53 +08:00
用稀疏矩阵。稀疏矩阵 0 不占内存。操作基本和 numpy array 一致。你想要的结果只能用列表生成式了
[_[_>=4] for _ in t]
In [2]: [_[_>=4] for _ in t]
Out[2]: [array([4]), array([], dtype=int64), array([4]), array([4, 5, 6])]

In [3]: np.array([_[_>=4] for _ in t])
Out[3]:
array([array([4]), array([], dtype=int64), array([4]), array([4, 5, 6])],
dtype=object)
得到一个 object array

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/627599

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX