У меня есть некоторые проблемы с ошибкой значения в python

#python #scipy #valueerror

#python #scipy #ошибка значения

Вопрос:

Вот мои коды для построения кривой напряжения-деформации

 import matplotlib.pyplot as plt
import numpy as np
import math
from scipy.interpolate import interp1d
from matplotlib.offsetbox import AnchoredText
import pandas as pd


#both strain is a column in the given dataframe, and I manually calculated stress
df_1 = pd.read_csv('1045.csv',skiprows=25,header=[0,1])
print(df_1.head())

A1 = 40.602*(10e-6)
stress1 = ((df_1.Load)/A1)


plt.figure(figsize=(12,9))
plt.plot(df_1.Strain1.values,df_1.Load.values,'g')
plt.ylabel('stress(Pa)',fontsize=13)
plt.xlabel('Strain(%)',fontsize=13)
plt.xticks(np.arange(-6e-5,0.15,step=0.005),rotation = 45)
plt.yticks(np.arange(0,42000,step=1000))

strain = df_1.Strain1.values
stress = np.array(((df_1.Load.values)/A1))
strain = np.array((df_1.Strain1.values))

LinearLimit=1
Strain_values_linear = np.linspace(strain[0], strain[LinearLimit], num=50, endpoint=True)
Strain_values_eng = np.linspace(strain[LinearLimit], strain[-1], num=50, endpoint=True)
f1 = interp1d(strain, stress, fill_value='extrapolate')
f2 = interp1d(strain, stress, kind=3, fill_value='extrapolate')

  

Теперь я продолжаю получать сообщение об ошибке значения: «массивы x и y должны быть одинаковой длины вдоль оси интерполяции». Я этого не понимаю … я напечатал форму деформации и напряжения, и они одинаковы
Кстати, вот скриншот файла csv:
введите описание изображения здесь

Ответ №1:

Вероятно, вы передаете массив формы (..., N) в качестве первого аргумента (значение strain имеет форму формы (..., N) ). SciPy не допускает этого и выдает ValueError . Подробности см. В документации. Вы должны запустить цикл for, если у вас есть несколько векторов в strain массиве. Следующий код должен работать, учитывая, что вы хотите интерполировать 1 функцию для каждой строки в strain (и этот штамм представляет собой двумерный массив. Если это не так, вы можете легко преобразовать его с помощью strain.reshape(-1, N) ):

 import matplotlib.pyplot as plt
import numpy as np
import math
from scipy.interpolate import interp1d
from matplotlib.offsetbox import AnchoredText
import pandas as pd


#both strain is a column in the given dataframe, and I manually calculated stress
df_1 = pd.read_csv('1045.csv',skiprows=25,header=[0,1])
print(df_1.head())

A1 = 40.602*(10e-6)
stress1 = ((df_1.Load)/A1)


plt.figure(figsize=(12,9))
plt.plot(df_1.Strain1.values,df_1.Load.values,'g')
plt.ylabel('stress(Pa)',fontsize=13)
plt.xlabel('Strain(%)',fontsize=13)
plt.xticks(np.arange(-6e-5,0.15,step=0.005),rotation = 45)
plt.yticks(np.arange(0,42000,step=1000))

strain = df_1.Strain1.values
stress = np.array(((df_1.Load.values)/A1))
strain = np.array((df_1.Strain1.values))

LinearLimit=1
Strain_values_linear = np.linspace(strain[0], strain[LinearLimit], num=50, endpoint=True)
Strain_values_eng = np.linspace(strain[LinearLimit], strain[-1], num=50, endpoint=True)

f1, f2 = [], []
for row in range(len(strain)):
    f1.append(interp1d(strain[row], stress, fill_value='extrapolate'))
    f2.append(interp1d(strain[row], stress, kind=3, fill_value='extrapolate'))
  

Редактировать: из комментария у вас есть strain массив формы (222, 1) . Это означает, что у вас уже есть вектор, но форма несовместима с тем, что принимает SciPy. В этом случае вам придется изменить форму массива деформации и сжатия, чтобы иметь форму формы (N,) . Следующий код должен работать:

 import matplotlib.pyplot as plt
import numpy as np
import math
from scipy.interpolate import interp1d
from matplotlib.offsetbox import AnchoredText
import pandas as pd


#both strain is a column in the given dataframe, and I manually calculated stress
df_1 = pd.read_csv('1045.csv',skiprows=25,header=[0,1])
print(df_1.head())

A1 = 40.602*(10e-6)
stress1 = ((df_1.Load)/A1)


plt.figure(figsize=(12,9))
plt.plot(df_1.Strain1.values,df_1.Load.values,'g')
plt.ylabel('stress(Pa)',fontsize=13)
plt.xlabel('Strain(%)',fontsize=13)
plt.xticks(np.arange(-6e-5,0.15,step=0.005),rotation = 45)
plt.yticks(np.arange(0,42000,step=1000))

strain = df_1.Strain1.values
stress = np.array(((df_1.Load.values)/A1))
strain = np.array((df_1.Strain1.values))
strain = strain.reshape(-1,)
stress = stress.reshape(-1,)

LinearLimit=1
Strain_values_linear = np.linspace(strain[0], strain[LinearLimit], num=50, endpoint=True)
Strain_values_eng = np.linspace(strain[LinearLimit], strain[-1], num=50, endpoint=True)
f1 = interp1d(strain, stress, fill_value='extrapolate')
f2 = interp1d(strain, stress, kind=3, fill_value='extrapolate')
  

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

1. Я напечатал форму массивов деформаций и напряжений, они оба (222,1). я попытался использовать for look, который вы указали выше, но здесь я получаю другую ошибку: ValueError: массивы x и y должны содержать не менее 2 записей. Я не могу понять, что это значит

2. Я добавил скриншот моего csv-файла выше

3. У вас уже есть вектор, поэтому нет необходимости запускать цикл for. Вам придется изменить свой strain массив, чтобы (222,) использовать форму strain = strain.reshape(-1,) . Все остальное при прочих равных условиях. Я соответствующим образом обновлю ответ.