如何解决空数组的Python对象数组
我试图在不使用循环的情况下创建一个空数组的 numpy 数组。使用循环,我可以使用像
这样的简化操作a = np.empty((3,3),object)
for i in range(a.size):
a.ravel()[i] = np.array([])
或者基于 np.nditer
的稍微复杂的方法:
a = np.empty((3,object)
it = np.nditer(a,flags=['multi_index','refs_ok'])
for i in it:
a[it.multi_index] = np.array([])
我似乎找不到允许我以矢量化方式进行此分配的索引表达式。
我尝试了以下方法:
>>> a[:] = np.zeros((0,3,3))
Traceback (most recent call last):
File "<stdin>",line 1,in <module>
ValueError: could not broadcast input array from shape (0,3) into shape (3,3)
>>> a[...,None] = np.zeros((3,0))
Traceback (most recent call last):
File "<stdin>",in <module>
ValueError: could not broadcast input array from shape (3,0) into shape (3,1)
>>> a = np.full((3,np.array([]),object)
Traceback (most recent call last):
File "<stdin>",in <module>
File "/usr/lib/python3.9/site-packages/numpy/core/numeric.py",line 343,in full
multiarray.copyto(a,fill_value,casting='unsafe')
File "<__array_function__ internals>",line 5,in copyto
ValueError: could not broadcast input array from shape (0,) into shape (3,3)
即使是 np.nditer
也不允许我回信:
>>> a = np.empty((3,object)
>>> for x in np.nditer(a,flags=['refs_ok'],op_flags=['readwrite']):
... x[...] = np.array([])
Traceback (most recent call last):
File "<stdin>",line 2,) into shape ()
有没有办法以矢量化的方式制作空数组的对象数组?
我正在寻找的确切输出是
array([[array([],dtype=float64),array([],dtype=float64)],[array([],dtype=float64)]],dtype=object)
就这个问题而言,我不在乎引用是同一个数组还是不同的数组。
解决方法
通过将数组放入另一个数组,您可以获得 NumPy 的广播处理,将数组视为标量对象而不是广播源:
template = numpy.empty((),dtype=object)
element = numpy.array([],dtype=float)
template[()] = element
然后您可以执行广播分配将 element
数组存储在结果数组的每个单元格中:
result = numpy.empty((3,3),dtype=object)
result[:] = template
广播逻辑将通过 template
而不是 element
进行广播。这会产生一个 3×3 result
对象 dtype 数组,其中每个单元格都保存对单个 element
数组的引用。
result = numpy.full((3,template)
也可以,但它似乎比切片分配更令人困惑,而且切片分配已经相当混乱 - {{1 }} 最终持有对 result
或 template
的引用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。