从CSV文件读取时对数组的数值运算

时间:2016-03-20 12:32:21

标签: python arrays python-3.x numpy matrix

我正在尝试在几个数组上进行一些数值运算,同时从CSV文件中读取一些值。

我有一个固定接收器的坐标,我从跟踪太阳的CSV文件中读取定日镜的坐标。

接收者的坐标:

# co-ordinates of Receiver
XT = 0  # X co-ordinate of Receiver
YT = 0   # Y co-ordinate of Receiver
ZT = 207.724  # Z co-ordinate of Receiver, this is the height of tower 
A = np.array(([XT],[YT],[ZT]))
print(A," are the co-ordinates of the target i.e. the receiver")

十个定日镜的坐标: 我从CSV文件中读取的数据包含以下数据:

#X,Y,Z
#-1269.56,-1359.2,5.7
#1521.28,-68.0507,5.7
#-13.6163,1220.79,5.7
#-1388.76,547.708,5.7
#1551.75,-82.2342,5.7
#405.92,-1853.83,5.7
#1473.43,-881.703,5.7
#1291.73,478.988,5.7
#539.027,1095.43,5.7
#-1648.13,-73.7251,5.7

我按如下方式阅读了CSV的坐标:

import csv
# Reading data from csv file
with open('Heliostat Field Layout Large heliostat.csv') as csvfile:
readCSV = csv.reader(csvfile, delimiter=',')
X = []
Y = []
Z = []
for row in readCSV:
    X_coordinates = row[0]
    Y_coordinates = row[1]
    Z_coordinates = row[2]
    X.append(X_coordinates)
    Y.append(Y_coordinates)
    Z.append(Z_coordinates)
Xcoordinate = [float(X[c]) for c in range(1,len(X))]
Ycoordinate=[float(Y[c]) for c in range(1,len(Y))]
Zcoordinate=[float(Z[c]) for c in range(1,len(Z))]

现在,当我尝试打印十个定日镜的坐标时,我得到三个大阵列,所有Xcoordinate,Ycoordinate和Zcoordinate分为一个而不是十个不同的输出。

 [[[-1269.56    1521.28     -13.6163 -1388.76    1551.75     405.92    1473.43
1291.73     539.027  -1648.13  ]]

 [[-1359.2      -68.0507  1220.79     547.708    -82.2342 -1853.83
-881.703    478.988   1095.43     -73.7251]]

 [[    5.7        5.7        5.7        5.7        5.7        5.7        5.7
   5.7        5.7        5.7   ]]]  are the co-ordinates of the heliostats

我用过:

B = np.array(([Xcoordinate],[Ycoordinate],[Zcoordinate]))
print(B," are the co-ordinates of the heliostats")

错误是什么?

此外,我想有一个我喜欢B-A的阵列 我使用的是:

#T1 = matrix(A)- matrix(B)
#print(T1," is the target vector for heliostat 1, T1")

我应该如何对数组A和B进行数值运算?我在这里试过矩阵运算。这是错的吗?

1 个答案:

答案 0 :(得分:1)

您的代码是正确的

以下输出是numpy数组的显示方式。

  

[[ - 1359.2 -68.0507 1220.79 547.708 -82.2342 -1853.83   -881.703 478.988 1095.43 -73.7251]]

尽管人们认为价值观被困在一起,但它们在阵列中完全不同。您可以使用

访问单个值
print(B[1, 0, 0])    # print Y[0]

您想要执行的数组A和B的减法将起作用

T1 = np.matrix(A)- np.matrix(B)
print(T1," is the target vector for heliostat 1, T1")

我可以提出两点建议吗?

  • 您可以使用numpy的函数loadtxt读取在文本文件中写成矩阵的numpy数组(这里的情况就是这样):

    your_file = 'Heliostat Field Layout Large heliostat.csv'
    B = np.loadtxt(your_file, delimiter=',', skiprows=1)
    

    结果将是(3,10)numpy数组。

  • 您可以直接在numpy数组上执行广泛的操作(因此您不需要在矩阵中转换它)。你只需要小心尺寸。

    在原始脚本中,您只需要写:

    T1 = A - B
    

    如果你按照建议得到带有loadtxt的数组B,你将获得一个(10,3)数组,而A是一个(3,1)数组。必须首先将数组B重新整形为(3,10)数组:

    B = B.reshape((3, 10))
    T1 = A - B
    

编辑:计算T1

的每个3D矢量的范数
norm_T1 = np.sqrt( np.sum( np.array(T1)**2, axis=0 ) )

请注意,在您的代码中,T1是一个矩阵,因此T1 ** 2是一个矩阵乘积。为了计算T1的每个向量v的sqrt(v [0] ** 2 + v [1] ** 2 + v [2] ** 2),我首先将其转换为numpy数组。