把一个点云numpy,按照x轴相同值,拆分成多个numpy
时间: 2023-11-10 17:01:36 浏览: 50
可以使用numpy中的split函数来实现。
假设点云numpy为points,其中每个点的坐标为(x,y,z),可以按照x轴相同的值将其拆分成多个numpy数组。
首先,需要对points按照x轴升序排序:
```python
sorted_points = points[np.argsort(points[:, 0])]
```
然后,可以使用split函数按照x轴相同的值进行拆分:
```python
x_values = sorted_points[:, 0]
split_indices = np.where(np.diff(x_values) > 0)[0] + 1
split_points = np.split(sorted_points, split_indices)
```
这里,np.diff(x_values) > 0可以得到一个布尔数组,表示相邻两个元素是否不同,然后np.where可以得到这些不同的位置索引,最后加1是因为split函数需要的是切割点的下标。
最终,split_points就是按照x轴相同值拆分后的多个numpy数组。可以使用for循环遍历每个数组进行处理。
相关问题
def plot_rate( rate_his, rolling_intv = 50, ylabel='标准化计算速率',ax=None): import matplotlib.pyplot as plt import pandas as pd import matplotlib as mpl rate_array = np.asarray(rate_his) # 将一个 Python 列表 rate_his 转换为 NumPy 数组 rate_array df = pd.DataFrame(rate_his) # 创建了一个名为df的Pandas DataFrame对象,将rata_his数据进行索引拆分过滤排序 if ax is None: fig, ax = plt.subplots(figsize=(15, 8)) mpl.style.use('seaborn') #设置matplotlib 库的绘图风格为 seaborn 风格 fig, ax = plt.subplots(figsize=(15,8))# 使用 Matplotlib 库创建一个带有指定大小的子图对象,宽为15,高为8 plt.plot(np.arange(len(rate_array))+1, np.hstack(df.rolling(rolling_intv, min_periods=1).mean().values), 'b') #使用plt.plot函数将生成的x轴和y轴坐标绘制成折线图,并且'b' 表示蓝色的线条。 plt.fill_between(np.arange(len(rate_array))+1, np.hstack(df.rolling(rolling_intv, min_periods=1).min()[0].values), np.hstack(df.rolling(rolling_intv, min_periods=1).max()[0].values), color = 'b', alpha = 0.2) #将这两个曲线之间的区域填充成颜色为蓝色、透明度为0.2的矩形 plt.ylabel(ylabel)# 设置纵轴标签 plt.xlabel('Time Frames')#设置横轴标签 plt.show(), plot_rate(Q.sum(axis=1)/N, 100, 'Average Data Queue') plot_rate(energy.sum(axis=1)/N, 100, 'Average Energy Consumption'),将多个函数绘制于横坐标相同的,放在一张子图里
您的代码是用于绘制两个函数在同一个子图中的折线图,并使用了Pandas和Matplotlib库来实现。其中,通过np.hstack函数将Pandas DataFrame对象转换为NumPy数组,并使用rolling函数对数据进行滚动平均处理,以减少数据的噪声。使用fill_between函数将两个曲线之间的区域填充为一个矩形,以突出两条曲线之间的差异。最后,使用plt.ylabel和plt.xlabel函数设置纵轴和横轴的标签,并使用plt.show函数显示图形。
如果您想要将多个函数绘制于横坐标相同、纵坐标不同的多个子图中,可以使用Matplotlib库中的subplot函数来实现。subplot函数可以在一个大的图形中创建多个子图,并指定每个子图的位置和大小。例如:
```
import matplotlib.pyplot as plt
fig, axs = plt.subplots(2, 1, figsize=(15, 8)) #创建一个2行1列的子图,每个子图的大小为15*8
axs[0].plot(x, y1) #在第一个子图中绘制第一个函数
axs[0].set_ylabel('y1') #设置第一个子图的纵轴标签
axs[1].plot(x, y2) #在第二个子图中绘制第二个函数
axs[1].set_ylabel('y2') #设置第二个子图的纵轴标签
plt.xlabel('x') #设置横轴标签
plt.show() #显示子图
```
在这个例子中,我们使用subplot函数创建了一个2行1列的子图,每个子图的大小为15*8。然后我们在第一个子图中绘制了第一个函数y1,并设置了纵轴标签。接着,我们在第二个子图中绘制了第二个函数y2,并设置了纵轴标签。最后,我们使用plt.xlabel函数设置横轴标签,并使用plt.show函数显示子图。
import pandas as pd import os from scipy import integrate, signal import numpy as np import matplotlib import matplotlib.pyplot as plt matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文 matplotlib.rcParams['axes.unicode_minus'] = False # 用来正常显示正负号 #y = pd.read_excel(r'C:\Users\ppddcsm\Desktop\第一批数据拆分\第一批1号1振\A1-1-600.xlsx', usecols=[1],index_col=False, header=None ,skiprows=[0]) folder_path = r'C:\Users\ppddcsm\Desktop\第二批数据拆分\第二批1号1振' file_names = os.listdir(folder_path) for file_name in file_names: file_path = os.path.join(folder_path, file_name) y = pd.read_excel(file_path) N = len(y) fs = 1280 dt = 1/fs #t_axis = [i * dt for i in range(len(y))] # 时间轴 t_axis = [i * dt for i in range(len(y))] y1 = y.swapaxes(0, 1) # 矩阵转置 data = y1.fillna(-1).values #获取数据,将缺失值标记设置为-1,并转换为NumPy数组对象 t = data.flatten() # 展平数组 a = np.array(t) # 梯形法 cumtrapz累计计算积分,cumtrapz(y, x=None, dx=1.0, axis=-1, initial=None)。y: 需要被积分的数值序列;x: y中元素的间距,积分变量,若为空,则y元素的间距默认为dx; # 续:dx: 如果x为空,y中元素的间距由dx给出;axis: 确定积分轴;initial: 如果提供,则用该值作为返回值的第一个数值。 #y_int = integrate.cumtrapz(np.array(a), x=None, dx=0.00078125, initial=0)*1000 # m到mm转换要乘1000 #y_int = np.multiply(integrate.cumtrapz(np.array(a), x=None, dx=0.00078125, initial=0), 1000) Y = integrate.cumtrapz(np.array(a), x=None, dx=0.00078125, initial=0) y_int = np.multiply(Y, 1000)
这段代码的目的是对给定的文件夹中的Excel文件进行处理,计算其累积梯形积分,并将结果保存在y_int中。在这段代码中,首先使用pandas库读取Excel文件,然后将数据转换为NumPy数组。接下来,使用scipy库中的cumtrapz函数对数组进行累积梯形积分操作,并将结果乘以1000,得到y_int。
根据你提供的错误信息,看起来是在cumtrapz函数的调用中出现了类型错误。这可能是因为a数组中包含了非数值类型的数据,导致无法进行数值积分。你可以检查一下数据是否正确加载,并且数据的类型是否正确。如果数据包含非数值类型的元素,你可能需要进行一些数据清洗或转换操作,以确保cumtrapz函数可以正常工作。
另外,你在代码中注释掉了一行y_int的计算方式,可能是为了测试不同的计算方法。你可以尝试取消注释并使用这种计算方式,看看是否能够避免类型错误。如果仍然存在问题,请提供更多的错误信息或具体描述问题的情况,以便我能够帮助你解决问题。