高性能的多维数组对象和对应的操作:Numpy的数组对象比Python的内置数据结构提供了更高效的存储和数据操作。
广泛的数学函数库:Numpy提供了大量的数学函数,用于快速对数组进行计算,包括线性代数、统计操作等。
数组广播功能:Numpy可以让不同大小的数组在一起进行数学运算。
使用案例
1. 计算两组节点的最近与最远空间距离
假设我们有两组空间点A和B,我们想要计算组A中的每个点与组B中的每个点之间的最近和最远距离。这是以前所分享的一个案例,这里再重新介绍下。tcl调用Python实现两组节点最近距离计算
import numpy as np# 假设A和B是两组空间点,每行代表一个点,列代表维度A = np.array([[1, 2, 3], [4, 5, 6]])B = np.array([[7, 8, 9], [10, 11, 12]])# 计算所有A与B之间的距离distances = np.sqrt(np.sum((A[:, np.newaxis, :] - B[np.newaxis, :, :]) ** 2, axis=2))# 找到最近和最远的距离min_distance = np.min(distances)max_distance = np.max(distances)print("最近距离:", min_distance)print("最远距离:", max_distance)
2. 两个空间点的距离
import numpy as nppoint1 = np.array([1, 2, 3])point2 = np.array([4, 5, 6])distance = np.linalg.norm(point1 - point2)print("两点之间的距离是:", distance)
import numpy as npA = np.array([1, 2, 3])B = np.array([4, 5, 6])vector = B - Aprint("从A到B的矢量:", vector)
4.矢量的相关函数
import numpy as npdef calculate_vectors(points):"""根据输入点的数量,计算归一化矢量或法向量。返回:vector -- 归一化的矢量或法向量。first_point -- 第一个点的坐标。"""num_points = points.shape[0]if num_points < 2:raise ValueError("至少需要两个点来进行计算。")if num_points == 2:# 计算两点之间的矢量并归一化vector = points[1] - points[0]norm = np.linalg.norm(vector)normalized_vector = vector / normreturn normalized_vector, points[0]else:# 计算前三个点的法向量vector1 = points[1] - points[0]vector2 = points[2] - points[0]normal_vector = np.cross(vector1, vector2)norm = np.linalg.norm(normal_vector)normalized_normal_vector = normal_vector / normreturn normalized_normal_vector, points[-1]# 示例使用# 两点points_2 = np.array([np.random.rand(3),np.random.rand(3)])# 三点points_3 = np.array([np.random.rand(3),np.random.rand(3),np.random.rand(3)])# 四点(只考虑前三点)points_4 = np.array([np.random.rand(3),np.random.rand(3),np.random.rand(3),np.random.rand(3)])vector, first_point = calculate_vectors(points_2)vector, first_point = calculate_vectors(points_3)vector, first_point = calculate_vectors(points_4)
5、计算垂直于一个矢量的其余两个矢量,教程最后的案例会使用到
import numpy as npdef find_perpendicular_vectors(point, vector):"""参数:point -- 空间点,形式为(x, y, z)。vector -- 给定的矢量,形式为(vx, vy, vz)。"""# 确保给定的矢量不是零矢量if np.allclose(vector, np.zeros(3)):raise ValueError("给定的矢量不能是零矢量。")random_vector = np.random.rand(3)perpendicular_vector1 = np.cross(vector, random_vector)perpendicular_vector2 = np.cross(vector, perpendicular_vector1)perpendicular_vector1_normalized = perpendicular_vector1 / np.linalg.norm(perpendicular_vector1)perpendicular_vector2_normalized = perpendicular_vector2 / np.linalg.norm(perpendicular_vector2)return perpendicular_vector1_normalized, perpendicular_vector2_normalizedpoint = np.array([1, 2, 3])# 以z轴方向的单位矢量为例,当然可以通过判断生成任意轴向量判断两个轴是否平行vector = np.array([0, 0, 1])perpendicular_vectors = find_perpendicular_vectors(point, vector)print(perpendicular_vectors)
这些例子展示了Numpy在处理矢量计算中的一些基本用法。Numpy的功能非常强大,这里只是冰山一角。