0

[编辑]

好的,我的测试用例没有经过深思熟虑。我只测试了一维数组。在这种情况下,我会返回一个 64 位标量。如果我在 3D 数组上执行此操作,我会按预期得到 32 位。

我正在尝试计算一个非常大的 numpy 数组(600*600*4044)的平均值和标准偏差,并且我接近我的内存限制(在 64 位机器上为 16GB)。因此,我试图将所有内容处理为 float32 而不是默认的 float64。但是,每当我尝试处理数据时,即使我将 dtype 指定为 float32,我也会返回 float64。为什么会这样?是的,我可以在之后进行转换,但就像我说的那样,我已经接近我的 RAM 的极限,即使在处理步骤期间,我也会尽量保持一切尽可能小。下面是我得到的一个例子。

import scipy
a = scipy.ones((600,600,4044), dtype=scipy.float32)
print(a.dtype)

a_mean = scipy.mean(a, 2, dtype=scipy.float32)
a_std = scipy.std(a, 2, dtype=scipy.float32)

print(a_mean.dtype)
print(a_std.dtype)

退货

float32
float32
float32
4

2 回答 2

1

注意此答案适用于原始问题

您必须切换到 64 位 Python。根据您的评论,即使使用 32 位浮点数,您的对象也有 5.7GB 大小。这最多不适合 4GB 的 32 位地址空间。

一旦你切换到 64 位 Python,我认为你可以不用担心使用 64 位浮点数的中间值。事实上,您很可能使用 64 位浮点数来执行整个计算。

如果您已经在使用 64 位 Python(并且您的评论让我对此感到困惑),那么您根本不需要担心scipy.meanscipy.std返回 64 位浮点数。这是您数组中约 15 亿个值中的一个值。没什么好担心的。

注意此答案适用于新问题

您问题中的代码产生以下输出:

浮动32
浮动32
浮动32

换句话说,您报告的症状实际上并不代表现实。造成混淆的原因是您之前的代码(我的原始答案所应用的代码)完全不同并且在单维数组上运行。它看起来非常像scipy将标量返回为float64. 但是当返回值不是标量时,那么数据类型就不会按照你想象的方式进行转换。

于 2013-06-07T10:15:34.690 回答
0

You can force to change the base type :

a_mean = numpy.ndarray( scipy.mean(a, dtype=scipy.float32) , dtype = scipy.float32 )

I have tested it, so feel free to correct me if I'm wrong.

There is a out option : http://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html

a = scipy.ones(10, dtype=scipy.float32)
b = numpy.array(0,dtype=scipy.float32)

scipy.mean(a, dtype=scipy.float32, out=b)

Test :

In [34]: b= numpy.array(0)

In [35]: b= numpy.array(0,dtype = scipy.float32)

In [36]: b.dtype
Out[36]: dtype('float32')

In [37]: scipy.mean(a, dtype=scipy.float32, out = numpy.array(b) )                                                       
Out[37]: 1.0

In [38]: b
Out[38]: array(0.0, dtype=float32)

In [39]: 
于 2013-06-07T10:24:42.963 回答