为指定dtype=objectnumpy.gradien公司

2024-04-26 17:42:12 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有办法指定numpy.gradient的数据类型?你知道吗

我使用了一个子数组,它抛出了以下错误:

ValueError: setting an array element with a sequence.

举个例子:

import numpy as np
a = np.empty([3, 3], dtype=object)
it = np.nditer(a, flags=['multi_index', 'refs_ok'])
while not it.finished:
    i = it.multi_index[0]
    j = it.multi_index[1]
    a[it.multi_index] = np.array([i, j])
    it.iternext()
print(a)

哪些输出

[[array([0, 0]) array([0, 1]) array([0, 2])]
 [array([1, 0]) array([1, 1]) array([1, 2])]
 [array([2, 0]) array([2, 1]) array([2, 2])]]

我想print(np.gradient(a))回来

array(
    [[array([[1, 0],[0, 1]]), array([[1, 0], [0, 1]]), array([[1, 0], [0, 1]])],
     [array([[1, 0], [0, 1]]), array([[1, 0], [0, 1]]), array([[1, 0],[0, 1]])],
     [array([[1, 0], [0, 1]]), array([[1, 0], [0, 1]]), array([[1, 0],[0, 1]])]],
    dtype=object)

注意,在这种情况下,向量场的梯度是恒等张量场。你知道吗


Tags: numpyindexobject错误npit数组array
1条回答
网友
1楼 · 发布于 2024-04-26 17:42:12

为什么要使用dtype对象数组?这比使用二维数组要费劲。你知道吗

例如

In [53]: a1=np.array([[1,2],[3,4],[5,6]])

In [54]: a1
Out[54]: 
array([[1, 2],
       [3, 4],
       [5, 6]])

In [55]: np.gradient(a1)
Out[55]: 
[array([[ 2.,  2.],
       [ 2.,  2.],
       [ 2.,  2.]]),
 array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])]

或者一列一列地工作,或者一行一行地工作

In [61]: [np.gradient(i) for i in a1.T]
Out[61]: [array([ 2.,  2.,  2.]), array([ 2.,  2.,  2.])]

In [62]: [np.gradient(i) for i in a1]
Out[62]: [array([ 1.,  1.]), array([ 1.,  1.]), array([ 1.,  1.])]

dtype=object仅当子数组/列表的类型和/或形状不同时才有意义。即使这样,它也不会给常规的Python列表添加太多内容。你知道吗

====================================

我可以拿你的2d a,用以下内容制作一个3d数组:

In [126]: a1=np.zeros((3,3,2),int)

In [127]: a1.flat[:]=[i for  i in a.flatten()]

In [128]: a1
Out[128]: 
array([[[0, 0],
        [0, 1],
        [0, 2]],

       [[1, 0],
        [1, 1],
        [1, 2]],

       [[2, 0],
        [2, 1],
        [2, 2]]])

或者我可以用meshgrid产生同样的结果:

In [129]: X,Y=np.meshgrid(np.arange(3),np.arange(3),indexing='ij')
In [130]: a2=np.array([Y,X]).T

当我对它应用np.gradient时,我得到3个数组,每个数组(3,3,2)的形状。你知道吗

In [136]: ga1=np.gradient(a1)

In [137]: len(ga1)
Out[137]: 3

In [138]: ga1[0].shape
Out[138]: (3, 3, 2)

看起来前两个数组有您想要的值,所以只需要重新排列它们。你知道吗

In [141]: np.array(ga1[:2]).shape
Out[141]: (2, 3, 3, 2)

In [143]: gga1=np.array(ga1[:2]).transpose([1,2,0,3])

In [144]: gga1.shape
Out[144]: (3, 3, 2, 2)

In [145]: gga1[0,0]
Out[145]: 
array([[ 1., -0.],
       [-0.,  1.]])

如果它们必须返回(3,3)对象数组,我可以:

In [146]: goa1=np.empty([3,3],dtype=object)

In [147]: for i in range(3):
    for j in range(3):
        goa1[i,j]=gga1[i,j]
   .....:         

In [148]: goa1
Out[148]: 
array([[array([[ 1., -0.],
       [-0.,  1.]]),
        array([[ 1., -0.],
       [ 0.,  1.]]),
        array([[ 1., -0.],
       ...
       [ 0.,  1.]]),
        array([[ 1.,  0.],
       [ 0.,  1.]])]], dtype=object)

我仍然想知道使用对象数组有什么意义。你知道吗

相关问题 更多 >