我有一个脚本读取csv文件中有非常大的字段:
# example from http://docs.python.org/3.3/library/csv.html?highlight=csv%20dictreader#examples
import csv
with open('some.csv', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(row)
Run Code Online (Sandbox Code Playgroud)
但是,这会在某些csv文件上引发以下错误:
_csv.Error: field larger than field limit (131072)
Run Code Online (Sandbox Code Playgroud) 它似乎不是处理器的"位数"(32对64),特别是对这篇文章的评论:
好答案.正如我在上面的评论中提到的,我能够在使用64位ARM处理器的Raspberry Pi 3上复制@ suzep136的问题.知道为什么在64位架构上会出现溢出问题吗?我唯一能想到的是lapack/blas是为32位内核编译的; 我想我通过apt-get安装了numpy. - nrlakin
它也不是C中int的大小,例如在我的机器上:
>>> import numpy, ctypes
>>>
>>> ctypes.sizeof(ctypes.c_int)
4
>>> numpy.array([1]).dtype
dtype('int64')
Run Code Online (Sandbox Code Playgroud)
那么,它取决于什么?
编辑:还有另一位候选人,谢谢你们:
LAPACK在所有架构上使用32位整数 - ev-br
编辑:部分答案在这里.谢谢Goyo.我已经复制了它并使其成为CW,因此您可以添加更精细的点,例如PyPy或Jython中发生的事情.我也对这个选择是否有更深层次的原因感兴趣.
让我从示例代码开始:
import numpy
from pandas import DataFrame
a = DataFrame({"nums": [2233, -23160, -43608]})
a.nums = numpy.int64(a.nums)
print(a.nums ** 2)
print((a.nums ** 2).sum())
Run Code Online (Sandbox Code Playgroud)
在我的本地计算机和其他开发人员的计算机上,这可以按预期工作并打印出来:
0 4986289
1 536385600
2 1901657664
Name: nums, dtype: int64
2443029553
Run Code Online (Sandbox Code Playgroud)
但是,在我们的生产服务器上,我们得到:
0 4986289
1 536385600
2 1901657664
Name: nums, dtype: int64
-1851937743
Run Code Online (Sandbox Code Playgroud)
这是32位整数溢出,尽管它是一个int64.
生产服务器使用python,numpy的,熊猫等相同版本这是一个64-bit Windows Server 2012OS,一切报道64位(例如python --version,sys.maxsize,plastform.architecture).
什么可能导致这个?
I'm starting to learn python, numpy and panda's and I have a really basic question, about sizes.
Please see the next code blocks:
1. Length: 6, dtype: int64
# create a Series from a dict
pd.Series({key: value for key, value in zip('abcdef', range(6))})
Run Code Online (Sandbox Code Playgroud)
vs.
2. Length: 6, dtype: int32
# but why does this generate a smaller integer size???
pd.Series(range(6), index=list('abcdef'))
Run Code Online (Sandbox Code Playgroud)
Question So I think when you put a list, numpy array, dictionary etc. in the pd.Series you will get …
我正在尝试使用numpy元素方形数组.我注意到有些值显示为负数.平方值不接近max int limit.有谁知道为什么会发生这种情况以及如何解决这个问题?我宁愿避免使用for循环来对数组元素进行平方,因为我的数据集非常大.
这是一个正在发生的事情的例子:
import numpy as np
test = [1, 2, 47852]
sq = np.array(test)**2
print(sq)
print(47852*47852)
Run Code Online (Sandbox Code Playgroud)
输出:
[1,4, -2005153392]
2289813904
Run Code Online (Sandbox Code Playgroud) 我正在研究一些线性代数的东西,并且根本不明白为什么numpy给出以下内容:
我从mathematica得到的结果是
编辑:如果您需要矩阵:
test = [[19722145, -21016468, 51417377],
[-185674670, 298847128, -428429486],
[289326728, -516012704, 691212936]]
A = [[9, 4, 1], [2, 0, 8], [-8, 8, -8]]
Run Code Online (Sandbox Code Playgroud) 我似乎找到了一个陷阱,使用.sum()的numpy数组,但我无法找到一个解释.从本质上讲,如果我尝试总结大阵,然后我开始变得无厘头的答案,但这种情况发生默默,我不能使输出足够好,谷歌的事业感.
例如,这与预期完全一样:
a = sum(xrange(2000))
print('a is {}'.format(a))
b = np.arange(2000).sum()
print('b is {}'.format(b))
Run Code Online (Sandbox Code Playgroud)
为两者提供相同的输出:
a is 1999000
b is 1999000
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用:
c = sum(xrange(200000))
print('c is {}'.format(c))
d = np.arange(200000).sum()
print('d is {}'.format(d))
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
c is 19999900000
d is -1474936480
Run Code Online (Sandbox Code Playgroud)
在更大的阵列上,可以获得积极的结果.这更加阴险,因为我可能不会发现一些不寻常的事情正在发生.例如:
e = sum(xrange(100000000))
print('e is {}'.format(e))
f = np.arange(100000000).sum()
print('f is {}'.format(f))
Run Code Online (Sandbox Code Playgroud)
给出这个:
e is 4999999950000000
f is 887459712
Run Code Online (Sandbox Code Playgroud)
我猜这是与数据类型有关,甚至使用python float似乎解决了这个问题:
e = sum(xrange(100000000))
print('e is {}'.format(e))
f = …Run Code Online (Sandbox Code Playgroud) 给出以下代码:
import numpy as np
c = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
c = np.array(c)
print((c * c.transpose()).prod())
Run Code Online (Sandbox Code Playgroud)
在我的 Windows 机器上,它返回“-1462091776”(不知道它是如何从所有这些正数中得到负数的)。在 ubuntu 上它返回“131681894400”
有人知道这是怎么回事吗?
编辑:显然这是一个溢出问题。(感谢@rafaelc!)但它是可重现的(也感谢@richardec 进行测试)
所以现在的问题是..这是我应该报告的错误吗?我该向谁报告?
从以下代码:
import numpy as np
print 2**np.array([32, 33])
Run Code Online (Sandbox Code Playgroud)
我得到负数[-2147483648 -2147483648].我正在使用python 2.6.这是某种bug吗?相反,print 2**32给出了正确的答案4294967296.