Python / Numpy:如何避免存储布尔索引的子数组?

纠结的制服8

在使用Numpy时,我经常需要使用布尔索引来访问数组的各个部分。为了使内容更易于阅读和输入,我经常将这些子数组存储到新变量中,例如:

n = 10000
X = np.random.rand((n, n))
W = np.random.random_integers(0, 1, n)
X0 = X[W==0]
X1 = X[W==1]

但是,当我处理越来越大的数据集时,这似乎非常浪费。在这种情况下,建议的做法是什么?我是否应该每次只写(在上面的示例中)X [W == 0]和X [W == 1]?

病毒

如果要索引的元素数量有限,则可能需要将索引存储为索引列表。为此,numpy.nonzero它非常有用。但是,如果要索引的元素数量很大,则通过存储布尔数组(每个元素1个字节)可以使用较少的内存。

因此,有四种可能性:

  1. 存储一个布尔数组
  2. 存储非零的索引
  3. 总是分开比较
  4. 蒙版数组

从内存存储的角度来看,备选方案1每个维度的每个索引元素占用8个字节。(当然,可以通过使用平面索引来避免“按维度”。)布尔方法每个元素占用1个字节,因此,如果True布尔表中包含a的元素多于1/8 ,则更多节省空间的解决方案。解决方案3可能占用与布尔解决方案相同的空间。

(我对NumPy的内部知识了解不足,无法对屏蔽数组说太多。我怀疑它们的行为类似于布尔索引。)

在性能方面情况类似。如果要选择的元素很多,则布尔型解决方案是有效的,但是如果元素数量很少,则索引解决方案会更好。

只是给出一些基准测试想法:

import numpy as np
import time

def create_indices(prob):
    data = np.random.random(100000000) < prob
    return data, np.nonzero(data)

def bool_index(data):
    return data[data]

def list_index(data, indices):
    return data[indices]

通过使用具有不同概率的时间,结果为:

    p    boolean   list
   0.01   0.206    0.012
   0.10   0.415    0.099
   0.20   0.405    0.146
   0.50   0.786    0.373
   0.75   0.539    0.555
   1.00   0.214    0.723

这实际上非常有趣:当元素的一半为时,使用布尔索引最糟糕True使用列表索引的行为符合预期。

此基准绝不能视为全部事实。可能是要建立索引的数组的类型改变了情况(此处bool与相同uint8),等等。但是,在大多数情况下,性能方面的列表索引似乎非常好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Python / Numpy:如何避免存储布尔索引的子数组?

来自分类Dev

python numpy数组索引

来自分类Dev

在python 3中使用布尔条件向量选择numpy子数组的简单方法

来自分类Dev

Python:如何为numpy数组的元素建立索引?

来自分类Dev

Python:如何为numpy数组的元素建立索引?

来自分类Dev

如何使用类似布尔型的方形对称numpy数组中的True值存储存储索引对?

来自分类Dev

Python / Numpy子数组选择

来自分类Dev

布尔索引将列值存储为python中的变量

来自分类Dev

找到最大值及其索引以移动numpy ndarray的子数组的Python方法是什么?

来自分类Dev

在python中索引numpy数组的澄清

来自分类Dev

Python numpy数组索引。怎么运作的?

来自分类Dev

从numpy数组python中提取索引

来自分类Dev

python索引不会更改numpy数组

来自分类Dev

从numpy数组python中提取索引

来自分类Dev

numpy / python-用重复的数组索引

来自分类Dev

python重复索引到列表或numpy数组

来自分类Dev

如何使用Python将各个数字的索引存储在单独数组中的列表中

来自分类Dev

python numpy的where和布尔数组之间的区别

来自分类Dev

将python列表转换为numpy数组布尔值

来自分类Dev

TypeError:提取索引时无法调用'numpy.ndarray'对象,并且元素在python中存储在不同的数组中

来自分类Dev

Python错误:只有整数,切片(`:`),省略号(`...`),numpy.newaxis(`None`)和整数或布尔数组才是有效索引

来自分类Dev

如何在python中使用多个索引同时填充numpy数组

来自分类Dev

子图索引在Python中如何工作?

来自分类Dev

Python如何以C速度遍历numpy中的数组并存储一些位置

来自分类Dev

如何在Python中将csv值形式的文件存储到numpy数组中?

来自分类Dev

如何在Python中将Alexnet的渐变存储为numpy数组(在每次迭代中)?

来自分类Dev

将迭代值存储到numpy数组-Python,Numpy

来自分类Dev

如何避免BeautifulSoup(Python)中的“列表索引超出范围”

来自分类Dev

如何用另一个数组中找到的值的索引替换Python NumPy数组中的值?

Related 相关文章

  1. 1

    Python / Numpy:如何避免存储布尔索引的子数组?

  2. 2

    python numpy数组索引

  3. 3

    在python 3中使用布尔条件向量选择numpy子数组的简单方法

  4. 4

    Python:如何为numpy数组的元素建立索引?

  5. 5

    Python:如何为numpy数组的元素建立索引?

  6. 6

    如何使用类似布尔型的方形对称numpy数组中的True值存储存储索引对?

  7. 7

    Python / Numpy子数组选择

  8. 8

    布尔索引将列值存储为python中的变量

  9. 9

    找到最大值及其索引以移动numpy ndarray的子数组的Python方法是什么?

  10. 10

    在python中索引numpy数组的澄清

  11. 11

    Python numpy数组索引。怎么运作的?

  12. 12

    从numpy数组python中提取索引

  13. 13

    python索引不会更改numpy数组

  14. 14

    从numpy数组python中提取索引

  15. 15

    numpy / python-用重复的数组索引

  16. 16

    python重复索引到列表或numpy数组

  17. 17

    如何使用Python将各个数字的索引存储在单独数组中的列表中

  18. 18

    python numpy的where和布尔数组之间的区别

  19. 19

    将python列表转换为numpy数组布尔值

  20. 20

    TypeError:提取索引时无法调用'numpy.ndarray'对象,并且元素在python中存储在不同的数组中

  21. 21

    Python错误:只有整数,切片(`:`),省略号(`...`),numpy.newaxis(`None`)和整数或布尔数组才是有效索引

  22. 22

    如何在python中使用多个索引同时填充numpy数组

  23. 23

    子图索引在Python中如何工作?

  24. 24

    Python如何以C速度遍历numpy中的数组并存储一些位置

  25. 25

    如何在Python中将csv值形式的文件存储到numpy数组中?

  26. 26

    如何在Python中将Alexnet的渐变存储为numpy数组(在每次迭代中)?

  27. 27

    将迭代值存储到numpy数组-Python,Numpy

  28. 28

    如何避免BeautifulSoup(Python)中的“列表索引超出范围”

  29. 29

    如何用另一个数组中找到的值的索引替换Python NumPy数组中的值?

热门标签

归档