【问题标题】:What does dtype=object mean while creating a numpy array?创建 numpy 数组时 dtype=object 是什么意思?
【发布时间】:2015-07-04 19:54:59
【问题描述】:

我正在试验 numpy 数组并创建了一个 numpy 字符串数组:

ar1 = np.array(['avinash', 'jay'])

正如我从他们的官方指南中读到的,对 numpy 数组的操作会传播到单个元素。所以我这样做了:

ar1 * 2

然后我得到这个错误:

TypeError                                 Traceback (most recent call last)
<ipython-input-22-aaac6331c572> in <module>()
----> 1 ar1 * 2

TypeError: unsupported operand type(s) for *: 'numpy.ndarray' and 'int'

但是当我使用dtype=object

ar1 = np.array(['avinash', 'jay'], dtype=object)

在创建数组时,我可以执行所有操作。

谁能告诉我为什么会这样?

【问题讨论】:

    标签: python arrays numpy types


    【解决方案1】:

    NumPy 数组存储为连续的内存块。它们通常具有单一数据类型(例如整数、浮点数或固定长度的字符串),然后内存中的位被解释为具有该数据类型的值。

    dtype=object 创建一个数组是不同的。数组占用的内存现在被 pointers 填充到 Python 对象,这些对象存储在内存中elsewhere(很像 Python list 实际上只是一个指针列表对象,而不是对象本身)。

    诸如* 之类的算术运算符不适用于ar1 之类的具有string_ 数据类型的数组(取而代之的是特殊函数- 见下文)。 NumPy 只是将内存中的位视为字符,* 运算符在这里没有意义。但是,这条线

    np.array(['avinash','jay'], dtype=object) * 2
    

    有效,因为现在数组是(指向)Python 字符串的数组。 * 运算符为这些 Python 字符串对象定义得很好。在内存中创建新的 Python 字符串,并返回一个新的 object 数组,其中包含对新字符串的引用。


    如果您有一个具有string_unicode_ dtype 的数组并且想要重复每个字符串,您可以使用np.char.multiply

    In [52]: np.char.multiply(ar1, 2)
    Out[52]: array(['avinashavinash', 'jayjay'], 
          dtype='<U14')
    

    NumPy 还有很多其他vectorised string methods

    【讨论】:

    • 你知道在对象数组上执行操作与尝试遍历 python 列表时是否有任何效率提升?
    猜你喜欢
    • 1970-01-01
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    相关资源
    最近更新 更多