GVKun编程网logo

为什么numpy.zeros占用很少的空间(numpy数据占用内存空间大小)

17

本文将介绍为什么numpy.zeros占用很少的空间的详细情况,特别是关于numpy数据占用内存空间大小的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些

本文将介绍为什么numpy.zeros占用很少的空间的详细情况,特别是关于numpy数据占用内存空间大小的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于API: numpy.zeros、python – 为什么numpy fft会返回错误的相位信息?、python – 为什么numpy.spacing(0)给我一个不可能的数字?、python – 为什么numpy允许你添加不同大小的数组?的知识。

本文目录一览:

为什么numpy.zeros占用很少的空间(numpy数据占用内存空间大小)

为什么numpy.zeros占用很少的空间(numpy数据占用内存空间大小)

我想知道为什么numpy.zeros占用这么小的空间?

x = numpy.zeros(200000000)

这不会占用任何内存,

x = numpy.repeat(0,200000000)

占用约1.5GB。numpy.zeros是否创建一个空指针数组?如果是这样,是否可以在cython中更改指针后将其设置为空?如果我使用:

x = numpy.zeros(200000000)x[0:200000000] = 0.0

内存使用率上升。有没有办法更改一个值,然后将其更改回numpy.zeros的格式,最初是在python或cython中使用的?

答案1

小编典典

您在使用Linux吗?Linux的内存分配是延迟的。malloccallocnumpy中的基础调用始终“成功”。在首次访问该内存之前,实际上没有分配任何内存。

zeros函数将使用calloc它在首次访问之前将所有分配的内存清零。因此,numpy无需将数组显式清零,因此将延迟初始化数组。而该repeat函数不能依赖于calloc初始化数组。相反,它必须使用malloc然后将重复项复制到数组中的所有元素(因此强制立即分配)。

API: numpy.zeros

API: numpy.zeros

为了以后查找方便;无时间整理,也没整理的必要,直接贴图了.
参考网站: http://docs.scipy.org/doc/numpy/reference/index.html

摘自: 《NumPy Reference, Release 1.7.0

python – 为什么numpy fft会返回错误的相位信息?

python – 为什么numpy fft会返回错误的相位信息?

我比较了Matlab和numpy中的相位和幅度谱.我认为Matlab工作正确,但numpy计算正确的幅度谱,但相位谱很奇怪.如何通过numpy更改 python代码以获得正确的计算fft?

Matlab的:

fs = 1e4;
dt = 1 / fs;
t = 0:dt:0.5;
F = 1e3;

y = cos(2*pi*F*t);
S = fftshift(fft(y) / length(y));
f_scale = linspace(-1,1,length(y)) * (fs / 2);

a = abs(S);
phi = (angle(S));

subplot(2,1)
plot(f_scale,a)
title('amplitude')

subplot(2,2)
plot(f_scale,phi)
title('phase')

Python:

import numpy as np
import matplotlib.pyplot as plt

fs = 1e4
dt = 1 / fs
t = np.arange(0,0.5,dt)
F = 1e3

y = np.cos(2*np.pi*F*t)
S = np.fft.fftshift(np.fft.fft(y) / y.shape[0])
f_scale = np.linspace(-1,y.shape[0]) * (fs / 2)

a = np.abs(S)
phi = np.angle(S)

plt.subplot(2,title="amplitude")
plt.plot(f_scale,a)

plt.subplot(2,2,title="phase")
plt.plot(f_scale,phi)

plt.show()

matlab output

numpy output

解决方法

这是理解np.arange的一个问题.它在达到所需值之前停止一个dt(你传递的间隔在右侧打开).如果你定义

t = np.arange(0,0.5+dt,dt)

一切都会好起来的.

python – 为什么numpy.spacing(0)给我一个不可能的数字?

python – 为什么numpy.spacing(0)给我一个不可能的数字?

我正在研究 Python.我尝试了numpy.spacing(0)并获得了4.9406564584124654e-324,这明显小于finfo(浮动).tiny = 2.2250738585072014e-308

这怎么可能?

我在网上找不到答案,就浮点标准而言,这个数字当然是不可能的.

解决方法

好的,让我们看看4.94e-324究竟是什么:

>>> from math import log
>>> log(4.94e-324,2)
-1074.0

并且只是为了确保:

>>> 2**-1074
5e-324

这肯定小于-1022,这应该是最小指数.实际上,它比最小值小52,即有效数中的位数.这里有一些有趣的东西……

你实际得到的是一个subnormal浮点数,它用指数为零编码(解释为实际可能的最低指数),并放宽了有效数字必须从二进制1开始的通常规则,允许你以精度为代价代表非常小的数字:

>>> (5e-324).hex()
'0x0.0000000000001p-1022'

python – 为什么numpy允许你添加不同大小的数组?

python – 为什么numpy允许你添加不同大小的数组?

当你做类似的事情时,为什么numpy不会抛出错误

np.ones((5,5)) + np.ones(5)

这种添加在线性代数中没有明确定义,它只花了我几个小时来追踪一个归结为这个的错误

最佳答案
np.ones((5,5)) + np.ones(5)
np.ones((5,5)) + np.ones(4) <- This would give a error.

因为np.ones(5)符合每一行的大小,所以它将逐行添加到每一行.

这就是numpy的工作方式.我不是线性代数模块.

这是一个如何做到的简短示例,这需要扩展,具有更多的逻辑和聪明.只是一个概念证明.

import numpy as np

class myMatrixClass(np.ndarray):
    def __add__(self,val):
        if (hasattr(val,'__iter__') and self.shape != val.shape):
            print "not valid addition!"
        else:
            return super(myMatrixClass,self).__add__(val)

In [33]: A = myMatrixClass( shape=(5,5))

In [34]: A[:] = 1

In [35]: B = A + 1

In [36]: B
Out[36]:
myMatrixClass([[ 2.,2.,2.],[ 2.,2.]])

In [37]: C = A + np.ones(5)
not valid addition!

关于为什么numpy.zeros占用很少的空间numpy数据占用内存空间大小的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于API: numpy.zeros、python – 为什么numpy fft会返回错误的相位信息?、python – 为什么numpy.spacing(0)给我一个不可能的数字?、python – 为什么numpy允许你添加不同大小的数组?等相关内容,可以在本站寻找。

本文标签: