高性能的多维数组对象和对应的操作: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 np
point1 = np.array([1, 2, 3])
point2 = np.array([4, 5, 6])
distance = np.linalg.norm(point1 - point2)
print("两点之间的距离是:", distance)
import numpy as np
A = np.array([1, 2, 3])
B = np.array([4, 5, 6])
vector = B - A
print("从A到B的矢量:", vector)
4.矢量的相关函数
import numpy as np
def 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 / norm
return 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 / norm
return 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 np
def 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_normalized
point = np.array([1, 2, 3])
# 以z轴方向的单位矢量为例,当然可以通过判断生成任意轴向量判断两个轴是否平行
vector = np.array([0, 0, 1])
perpendicular_vectors = find_perpendicular_vectors(point, vector)
print(perpendicular_vectors)
这些例子展示了Numpy在处理矢量计算中的一些基本用法。Numpy的功能非常强大,这里只是冰山一角。