簡體   English   中英

'float'沒有屬性dtype

[英]'float' has no attribute dtype

我有一組數據,並且使用numpy和scipy對數據進行了正態分布。 但是,當我嘗試打印pdf時,出現以下錯誤:

錯誤說明

我試圖更改Z的dtype,但這沒有用。 任何建議都會有所幫助。 謝謝。

import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d
import numpy as np
import random 
from sympy.matrices import Matrix
from sympy import symbols, pprint, N
from scipy.stats import multivariate_normal
from target import true_target_trajectory, target_posiion

def plot_gaussian(X, Y, Z):
    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    ax.plot_surface(X, Y, Z)
    plt.show()

def covariance(x, y):
    sigma1 = np.std(x, dtype=np.float64)
    sigma2 = np.std(y, dtype=np.float64)
    cov = np.matrix([[sigma1, sigma1*sigma2], [sigma1*sigma2, sigma2]])
    min_eig = np.min(np.real(np.linalg.eigvals(cov)))
    if min_eig < 0:
        cov -= 10*min_eig * np.eye(*cov.shape)
    return cov

def gaussian(x, mu, cov):
    rv = multivariate_normal(mu, cov)
    return rv.pdf(x)

#plot_gaussian()
vin = 300
qin = 9
x = []
y = []
time = np.linspace(0, 2*np.pi, 100)
for t in (time):
    cc = target_posiion(vin, qin, t)
    x.append(cc.T[0])
    y.append(cc.T[1])
mu = np.array([np.mean(x), np.mean(y)])
cov = covariance(x, y)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))
Z = gaussian(pos, mu, cov)
plot_gaussian(X, Y, Z)

我試圖用x = np.linspace(-1,3,100)和y = np.linspace(0,4,100)重現該問題。 但這並沒有給出任何錯誤,我得到了預期的鍾形曲線。 所以我附上目標位置的代碼。 target_position的代碼:

import random
import numpy as np
from sympy.vector.coordsysrect import CoordSys3D
from sympy.physics.mechanics import dynamicsymbols
from sympy import symbols, sin, pprint, Derivative, Identity, N
from sympy.matrices import Matrix, BlockMatrix, block_collapse

C = CoordSys3D('C')
i, j, k = C.base_vectors()

def evaluate_matrix(m, v_in, q_in, tk):
    w, t = symbols('w t')
    v0, q = symbols('v0 q')
    params = {v0:v_in, q:q_in, t:tk}
    return Matrix([[N(m[0].subs(params)), N(m[1].subs(params))]]).T

def true_target_trajectory(v_in, q_in, tk):
    w, t = symbols('w t')
    v0, q, A = symbols('v0 q A')
    r, v, a, x, y = dynamicsymbols('r v a x y')
    A = (v0**2)/q
    w = q/(2*v0)
    x = A*sin(w*t)*i
    y = A*sin(2*w*t)*j
    r = x + y
    r_m = Matrix(r.to_matrix(C)[:2])
    v = Derivative(r, t).doit()
    v_m = Matrix(v.to_matrix(C)[:2])
    a = Derivative(v, t).doit()
    a_m = Matrix(a.to_matrix(C)[:2])
    x_k = BlockMatrix([[r_m.T, v_m.T, a_m.T]]).T
    I = Identity(2)
    H = BlockMatrix([[I, I, I]])
    z = evaluate_matrix(block_collapse(H*x_k), v_in, q_in, tk)
    return z

def target_posiion(v_in, q_in, tk):
    sigma = 50
    u_k = Matrix([[random.gauss(0,1), random.gauss(0,1)]]).T
    z = true_target_trajectory(v_in, q_in, tk)
    z_c_k = z + sigma*u_k
    return z_c_k

問題

問題是您的xysympy.core.numbers.Float類型的sympy.core.numbers.Float ,而不是常規的Python float Numpy不知道如何轉換Sympy數值類型,因此meshgrid最終返回dtype dtype=object XY數組。 沿着這條線,最終結束了對ax.plot_surface的調用。

解決方法

只需將xy轉換為np.float64標准Numpy數組, np.float64再將它們傳遞給meshgrid

X, Y = np.meshgrid(np.array(x).astype(float), np.array(y).astype(float))

一旦這樣做,一切都會好起來的。 這是輸出:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM