python - 查看不同数据类型下的对象数组

标签 python numpy dtype

我想查看一个带有封装整行的 dtype 的对象数组:

data = np.array([['a', '1'], ['a', 'z'], ['b', 'a']], dtype=object)
dt = np.dtype([('x', object), ('y', object)])
data.view(dt)
我收到一个错误:
TypeError: Cannot change data-type for object array.
我尝试了以下解决方法:
dt2 = np.dtype([('x', np.object, 2)])
data.view()
data.view(np.uint8).view(dt)
data.view(np.void).view(dt)
所有情况都会导致相同的错误。有什么方法可以查看具有不同 dtype 的对象数组吗?
我还尝试了一种更通用的方法(这是供引用,因为它在功能上与上面显示的相同):
dt = np.dtype(','.join(data.dtype.char * data.shape[1]))
dt2 = np.dtype([('x', data.dtype, data.shape[1])])

最佳答案

似乎您总是可以使用 np.array 强制查看缓冲区:

view = np.array(data, dtype=dt, copy=not data.flags['C_CONTIGUOUS'])
虽然这是一种快速而肮脏的方法,但在这种情况下数据会被复制,并且 dt2未正确应用:
>>> print(view.base)
None
>>> np.array(data, dtype=dt2, copy=not data.flags['C_CONTIGUOUS'])
array([[(['a', 'a'],), (['1', '1'],)],
       [(['a', 'a'],), (['z', 'z'],)],
       [(['b', 'b'],), (['a', 'a'],)]], dtype=[('x', 'O', (2,))])
对于更正确的方法(在某些情况下),您可以使用原始 np.ndarray 构造函数:
real_view = np.ndarray(data.shape[:1], dtype=dt2, buffer=data)
这使得数据的真实 View :
>>> real_view
array([(['a', '1'],), (['a', 'z'],), (['b', 'a'],)], dtype=[('x', 'O', (2,))])
>>> real_view.base is data
True
如图所示,这仅在数据具有 C 连续行时才有效。

关于python - 查看不同数据类型下的对象数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64210754/

相关文章:

python - 解析输入标记

python - pytorch如何设置.requires_grad False

python - Matplotlib/Mplfinance 'y_on_right' 的正确用法?

python - 是否可以创建一个包含复杂整数的 numpy.ndarray?

python - 如何在 Pandas 中以这种方式转换列

python - 使用 OpenCv python 库从内存中读取 base 64 编码图像

Python 正则表达式奇怪的行为

python - 来自数组和 np.dtype 对象的结构化数组

python - 如何将 NumPy (k,n,m) 大小的 ndarray 转换为 (k) 大小 dttype=object ndarray 的 (n,m) 大小的 ndarray?

python - 如何让 tf.data.Dataset.from_tensor_slices 接受我的 dtype?