VisibleDeprecationWarning: создание ndarray из неровных вложенных последовательностей

#python #numpy

#python #numpy

Вопрос:

я пытаюсь обрезать набор данных, но получаю следующую ошибку:

Предупреждение (из модуля предупреждений): Файл «C:UsersDesktoppy_magnSnippingMap.py «, строка 66 res = np.array((x, y, clipMag)).T VisibleDeprecationWarning: создание ndarray из неровных вложенных последовательностей (которые представляют собой список или кортеж списков или кортежей или ndarrays разной длины или формы) устарело. Если вы намеревались это сделать, вы должны указать ‘dtype = object’ при создании ndarray

набор данных представляет собой магнитные измерения и размеры x, y в км области. с помощью этого кода я пытаюсь обрезать область размером 90×90. код:

 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

Комментарии:

1. Это предупреждение, а не ошибка. Вы можете сделать так, как написано в предупреждающем сообщении ( dtype=object ), чтобы предотвратить это.

2. Это предупреждение о том, что эти 3 массива (x, y, clipMag) отличаются по форме, и результирующий массив будет иметь тип объекта dtype и 1d. Тот факт, что вы следуете этому с помощью a .T , предполагает, что вы ожидаете, что результат будет 2d (или выше). Использование этого массива в savetxt также означает, что он должен быть 2d числовым. Вам необходимо просмотреть форму этих 3 входных данных массива. Что-то здесь не так.

3. @hpaulj я неправильно рассчитал форму, и теперь форма в порядке, но у меня по-прежнему такое же предупреждение, а также я не могу экспортировать их в csv

4. @Stef устанавливая dtype=object, я получаю следующую ошибку при попытке экспорта :

5. Обратная трассировка (последний последний вызов): Файл «C:PythonPython38libtkinter_init_.py «, строка 1883, в файле call return self.func(*args) «C:UsersStefanosDesktoppy_magnSnippingMap.py «, строка 77, в saveCSV np.savetxt(export_file_path, res, разделитель=» ) Файл «<__array_function_ internals>», строка 5, в файле savetxt «C:ProgramsPythonPython38libsite-packagesnumpylibnpyio.py «, строка 1426, в savetxt вызывает ошибку типа («Несоответствие между типом массива dtype (‘%s’) и » Ошибка типа: несоответствие между типом массива dtype (‘object’) и спецификатором формата (‘%.18e’)


Ответ №1:

Поэтому я изменил код и, в частности, функцию clipping() . Я использую pandas :

 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--------------------