VisibleDeprecationWarning:从不规则的嵌套序列创建一个 ndarray

Posted

技术标签:

【中文标题】VisibleDeprecationWarning:从不规则的嵌套序列创建一个 ndarray【英文标题】:VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences 【发布时间】:2021-05-10 20:11:53 【问题描述】:

我正在尝试剪辑数据集,但出现以下错误:

警告(来自警告模块): 文件“C:\Users\Desktop\py_magn\SnippingMap.py”,第 66 行 res = np.array((x, y, clipMag)).T VisibleDeprecationWarning:不推荐从不规则的嵌套序列(它是具有不同长度或形状的列表或元组或 ndarray 的列表或元组)创建 ndarray。如果您打算这样做,则必须在创建 ndarray 时指定 'dtype=object'

数据集是该区域的磁测量和尺寸 x,y,以 km 为单位。使用此代码,我尝试将区域裁剪为 90x90。 代码是:

root= tk.Tk()
canvas1 = tk.Canvas(root, width = 400, height = 400, bg = 'gray1', relief = 'raised')
canvas1.pack()
def getCSV ():
    global df
    
    import_file_path = filedialog.askopenfilename()
    df = np.genfromtxt(import_file_path, delimiter='_', missing_values = ' ', filling_values = None)
    
    print (df)
    
browseButton_CSV = tk.Button(text=" Import CSV File to clip ", command=getCSV, bg='OrangeRed4', fg='black', font=('helvetica', 12, 'bold'))
canvas1.create_window(200, 200, window=browseButton_CSV)
root.mainloop()
x, y, mag = df[:,0], df[:,1], df[:,3]
xmin, ymin = np.min(x), np.min(y)
xc, yc = (xmin + (90/2)), (ymin + (90/2)) # 90 einai to mege8os toy para8yrou
print(xmin,xc)
def clipping( x, y, mag, xc, yc):
    
    xmini, ymini = xc - 45, yc - 45
    xmaxi, ymaxi = xc + 45, xc + 45
    print(xmaxi, xc)
    count=0
    for i in x:
         if i>=xmini and i<=xmaxi:
             count += 1
    clipMag = mag[:count]
    xn, yn = np.unique(x), np.unique(y)
    
    ind = np.where(xn == xmini)
    ind=ind[0][0]
    xn = np.linspace(xmini, xmaxi, int(mt.sqrt(len(clipMag))))
    yn = np.linspace(ymini, ymaxi, int(mt.sqrt(len(clipMag))))
    print(xn, np.shape(xn))
    xn, yn = np.meshgrid(xn, yn)
    x, y = np.reshape(xn, (1,np.shape(xn)[0]*np.shape(xn)[1])), np.reshape(yn, (1,np.shape(yn)[0]*np.shape(yn)[1]))
    
    
    
    res = np.array((x, y, clipMag)).T
    root= tk.Tk()
    canvas1 = tk.Canvas(root, width = 300, height = 300, bg = 'gray1', relief = 'raised')
    canvas1.pack()
    def saveCSV ():
        global df
    
        export_file_path = filedialog.asksaveasfilename( defaultextension=".csv", filetypes=[("CSV files", '*.csv')])
        np.savetxt(export_file_path, res, delimiter='_')
    
    
    browseButton_CSV = tk.Button(text="      Export filled CSV Data File     ", command=saveCSV, bg='OrangeRed4', fg='black', font=('helvetica', 12, 'bold'))
    canvas1.create_window(150, 150, window=browseButton_CSV)
    root.mainloop()

while True:
    
    if (xc+45)>=np.max(x):
        if (yc+45)>=np.max(y):
            clipping(x, y, mag, xc, yc)
            break
        else:
            xc = xmin + (90/2)
            yc = yc + 45
    else:
        clipping(x, y, mag, xc, yc)
        xc = xc + 45

数据在 .csv 中

【问题讨论】:

这是一个警告,而不是错误。您可以按照警告消息 (dtype=object) 中的说明进行操作以防止它发生。 警告这3个数组(x, y, clipMag)的形状不同,结果数组将是object dtype和1d。您使用 .T 遵循这一事实表明您期望结果为 2d(或更高)。在savetxt 中使用该数组也意味着它应该是二维数字。您需要查看这 3 个数组输入的形状。那里出了点问题。 @hpaulj 我计算错了形状,现在形状没问题,但我继续收到相同的警告,而且我无法将它们导出到 csv @Stef 设置 dtype=object,当我尝试导出时出现以下错误: 回溯(最近一次调用最后一次):文件“C:\Python\Python38\lib\tkinter_init_.py”,第 1883 行,在 call return self.func(*args) File "C:\Users\Stefanos\Desktop\py_magn\SnippingMap.py", line 77, in saveCSV np.savetxt(export_file_path, res, delimiter='') File “<__array_function_> internals>”,第 5 行,在 savetxt 文件“C:\Programs\Python\Python38\lib\site-packages\numpy\lib\npyio.py”,第 1426 行,在 savetxt 中引发 TypeError( "数组 dtype ('%s') 和 "TypeError 不匹配:数组 dtype ('object') 和格式说明符 ('%.18e') 之间不匹配 【参考方案1】:

所以我更改了代码,特别是 clipping() 函数。我用熊猫 :

def clipping( x, y, z, mag, xc, yc):
    
    df1 = pd.DataFrame('X':x, 'Y':y, 'Z':z, 'MAG':mag)
    df1['geometry'] = list(zip(df1['X'], df1['Y'], df1['Z']))
    df1['geometry'] = df1['geometry'].apply(Point)
    gdfMAGN = gpd.GeoDataFrame(df1, geometry='geometry')
    
    x1, y1 = xc, yc
    # ____________[90000m X 90000m] IS THE WINDOW DIMENSIONS______________
    
    clipAr = Polygon([ (x1, y1), (x1, y1+90000), (x1 + 90000, y1 + 90000), (x1+90000, y1)])
    pol = gpd.GeoDataFrame([1], geometry=[clipAr] )
    
    res = gpd.clip(gdfMAGN, pol)
    resCSV = np.array([res['X'],res['Y'],res['Z'],res['MAG']]).T
    
    
    #---------------------START---SAVE---------------------
    root= tk.Tk()

    canvas1 = tk.Canvas(root, width = 300, height = 300, bg = 'gray1', relief = 'raised')
    canvas1.pack()

    def saveCSV ():
        global df
    
        export_file_path = filedialog.asksaveasfilename( defaultextension=".csv", filetypes=[("CSV files", '*.csv')])
        np.savetxt(export_file_path, resCSV, delimiter='_')
    
    
    browseButton_CSV = tk.Button(text="      Export filled CSV Data File     ", command=saveCSV, bg='OrangeRed4', fg='black', font=('helvetica', 12, 'bold'))
    canvas1.create_window(150, 150, window=browseButton_CSV)

    root.mainloop()
    #------------------------END---SAVE--------------------

【讨论】:

以上是关于VisibleDeprecationWarning:从不规则的嵌套序列创建一个 ndarray的主要内容,如果未能解决你的问题,请参考以下文章

尝试保存 .npy (numpy) 文件时出错