相对较新的Python。有一些C++方面的经验。
我编写了一个小程序,它读取CSV
文件(样本)并初始化两个数组和几个值。每行有两个值,这样的行有8763行。每一行的第一个值被放入一个数组中,第二个值被放入第二个数组中。然后将每个数组的最后三个值(总计6)给出另一个变量。
我希望得到尽可能精确的进一步计算,因此我尝试了浮点算法的decimal.Decimal方法,但是由于某些原因,它并不是那么精确。我想我用错了。它仍然处于可接受的容忍状态。
此外,还想知道是否有一种更好/更有效的方法来初始化数组和/或变量。
这是代码:
alpha = np.zeros(8763, dtype='float32') # Edited in later for clarity
gamma = np.zeros(8763, dtype='float32') # Edited in later for clarity
rf = 100
counter = 0
with open('CSVData.csv', 'r') as csv_file_in:
csv_reader = csv.reader(csv_file_in)
for line in csv_reader:
alpha[counter] = (float(decimal.Decimal(line[0]))) # Alpha Angle Initialized
gamma[counter] = (float(decimal.Decimal(line[1]))) # Gamma Angle Initialized
if counter == 8762:
break
counter = counter + 1
csv_file_in.close()
# Initializing last 6 parameters
C_NSX = rf * alpha[8760]
C_NSY = rf * gamma[8760]
C_EWX = rf * alpha[8761]
C_EWY = rf * gamma[8761]
NSC = int(alpha[8762])
EWC = int(gamma[8762])
这里,C_NSX的值应该是2790,但是是2789.9999185。(调试图像)
用途的信息
以下是我的问题陈述:
有一个八角形矩阵,例如,一行4个八角形,3个这样的行。四列三行八角形。但它们并不是以完美的矩形形式排列的。
第一个八角形,O(0,0)有坐标(0,0),而右边的和底部的有一点偏移。所以O(0,1)有坐标(15,50),O(1,0)有坐标(30,15)。这些信息足以定义整个八角形数组。现在下一个要求是找出这些八角形的净可见面积是多少。在第一个例子中,由于坐标很远,就不会有重叠,整个可见区域只是.
Total_Visible_Area = Area_of_Single_Octagon * No_Of_Rows * No_Of_Columns
但是,当坐标有点复杂时,例如,案例2:
在这里,相邻八角形之间的距离小于它们的宽度,因此它们是重叠的。坐标也是负的(这实际上并不重要,只是一些值得注意的东西)。现在,为了确定这方面的可见区域,我编写了以下函数。
我上面所写的代码是计算所有这些的第一步。每个病例都使用阿尔法、伽马、C_NSX、C_NSY、C_EWX、C_EWY、NSC和EWC来定义。其中Alpha和Gamma有8760个不同的值(大部分为零),所有其他值(大写)都是常量。我要找出8760宗个案中每宗个案的重叠范围。寻找那些我之前在这里讨论过的代码和思想不再有必要再次出现。在最后一个问题之后,我从CPP转到python,并开始学习OpenCV。
发布于 2020-01-13 11:05:10
您并没有真正提到所使用的值。您将始终在速度和内存之间进行权衡(在这种情况下,内存相当于有多少位数字)。
代码中的一些问题:
1)您将decimal.Decimal(line[0])
转换为float
,这将否定使用Decimal
的优势。这可能是你看到出乎意料的矛盾的一个原因。您有两个选项(在我看来),您从标准库中放弃使用numpy以支持array
,或者放弃使用Decimal
的伪装,使用纯numpy解决方案。但这将取决于你到底在做什么。
2)遍历csv是一种读取数据的方法,但是numpy实现了更好的加载CSV的方法。请参阅文档这里中的最后一个示例。
因此,最后的问题是,你希望这些数字尽可能准确是为了什么?请记住,文件中的值已经“错误”了,因为它们很可能来自浮点类型,因此在我看来,在本例中使用Decimal
不会获得任何结果。另一种情况是,如果值是整数,然后在程序中执行一些除法或乘法,在这种情况下,从一开始就控制浮点值,然后使用Decimal
可能是您想要做的事情。
请记住,高度精密的科学研究及其计算使用64位浮标,它们做得很好。
https://codereview.stackexchange.com/questions/235538
复制相似问题