小编Sau*_*tro的帖子

在IPython中释放巨大的numpy数组的内存

更新: - 这个问题在机器重启后解决了.还没有弄清楚为什么之前发生这种错误.

我有一个函数加载一个巨大的numpy数组(~980MB)并返回它.

当我第一次启动Ipython并调用此函数时,它会将数组加载到变量中而没有任何问题.

但是,如果我再次运行相同的命令,它将退出提出"内存错误".

我试过以下,

del hugeArray
Run Code Online (Sandbox Code Playgroud)

仍然发生同样的错误.我甚至尝试了以下内容

del hugeArray
gc.collect()
gc.collect()
Run Code Online (Sandbox Code Playgroud)

最初,gc.collect()返回145并且第二次调用返回48.但即使在此之后我调用该函数时,仍然会引发内存错误.

我可以再加载的唯一方法是重启ipython.我可以做些什么来释放ipython中的所有内存,以便我不必重新启动它?

----------------更新

以下是输出 %whos

Variable   Type      Data/Info
------------------------------
gc         module    <module 'gc' (built-in)>
gr         module    <module 'Generate4mRamp' <...>rom 'Generate4mRamp.pyc'>
np         module    <module 'numpy' from '/us<...>ages/numpy/__init__.pyc'>
plt        module    <module 'matplotlib.pyplo<...>s/matplotlib/pyplot.pyc'>
Run Code Online (Sandbox Code Playgroud)

除此之外,gr是我的模块,包含我用来加载数据立方体的函数.

---------如何重现错误

以下简单函数能够重现错误.

import numpy as np
import gc

def functionH():
    cube=np.zeros((200,1024,1024))
    return cube

testcube=functionH()   #Runs without any issue 

del testcube
testcube=functionH()  # Raises Memory Error

del testcube
gc.collect()
gc.collect()
testcube=functionH()  # Still Raises …
Run Code Online (Sandbox Code Playgroud)

python memory-management numpy ipython

49
推荐指数
1
解决办法
4万
查看次数

使用python和numpy中的大数据,没有足够的ram,如何在光盘上保存部分结果?

我正在尝试在python中实现具有200k +数据点的1000维数据的算法.我想使用numpy,scipy,sklearn,networkx和其他有用的库.我想执行所有点之间的成对距离等操作,并在所有点上进行聚类.我已经实现了以合理的复杂度执行我想要的工作算法但是当我尝试将它们扩展到我的所有数据时,我用完了ram.我当然这样做,在200k +数据上创建成对距离的矩阵需要很多内存.

接下来是:我真的很想在具有少量内存的糟糕计算机上执行此操作.

有没有可行的方法让我在没有低ram限制的情况下完成这项工作.它需要更长的时间才真正不是问题,只要时间要求不会无限!

我希望能够让我的算法工作,然后在一小时或五个小时后回来,而不是因为它用完了公羊而被卡住了!我想在python中实现它,并能够使用numpy,scipy,sklearn和networkx库.我希望能够计算到我所有点的成对距离等

这可行吗?我将如何解决这个问题,我可以开始阅读哪些内容?

最好的问候//梅斯默

python arrays numpy scipy bigdata

48
推荐指数
1
解决办法
2万
查看次数

将正态分布拟合为1D数据

我有一个1维数组,我可以计算这个样本的"均值"和"标准偏差"并绘制"正态分布",但我有一个问题:

我想在下图中绘制数据和正态分布:

我不知道如何绘制"数据"和"正态分布"

关于"scipy.stats中的高斯概率密度函数"的任何想法?

s = np.std(array)
m = np.mean(array)
plt.plot(norm.pdf(array,m,s))
Run Code Online (Sandbox Code Playgroud)

python numpy matplotlib scipy

48
推荐指数
2
解决办法
8万
查看次数

使用Matplotlib的pyplot绘制分隔2个类的决策边界

我真的可以使用提示来帮助我绘制决策边界以分离数据类.我通过Python NumPy创建了一些样本数据(来自高斯分布).在这种情况下,每个数据点是2D坐标,即由2行组成的1列向量.例如,

[ 1
  2 ]
Run Code Online (Sandbox Code Playgroud)

假设我有2个类,class1和class2,我通过下面的代码为class1创建了100个数据点,为class2创建了100个数据点(分配给变量x1_samples和x2_samples).

mu_vec1 = np.array([0,0])
cov_mat1 = np.array([[2,0],[0,2]])
x1_samples = np.random.multivariate_normal(mu_vec1, cov_mat1, 100)
mu_vec1 = mu_vec1.reshape(1,2).T # to 1-col vector

mu_vec2 = np.array([1,2])
cov_mat2 = np.array([[1,0],[0,1]])
x2_samples = np.random.multivariate_normal(mu_vec2, cov_mat2, 100)
mu_vec2 = mu_vec2.reshape(1,2).T
Run Code Online (Sandbox Code Playgroud)

当我绘制每个类的数据点时,它看起来像这样:

在此输入图像描述

现在,我想出了一个决策边界的等式来分离两个类,并希望将它添加到图中.但是,我不确定如何绘制此函数:

def decision_boundary(x_vec, mu_vec1, mu_vec2):
    g1 = (x_vec-mu_vec1).T.dot((x_vec-mu_vec1))
    g2 = 2*( (x_vec-mu_vec2).T.dot((x_vec-mu_vec2)) )
    return g1 - g2
Run Code Online (Sandbox Code Playgroud)

我真的很感激任何帮助!

编辑:直觉(如果我的数学正确)我会期望决定边界在我绘制函数时看起来有点像这条红线...

在此输入图像描述

python numpy matplotlib

45
推荐指数
5
解决办法
7万
查看次数

如何将列和行的pandas DataFrame子集转换为numpy数组?

我想知道是否有更简单,内存有效的方法从pandas DataFrame中选择行和列的子集.

例如,给定此数据帧:

df = DataFrame(np.random.rand(4,5), columns = list('abcde'))
print df

          a         b         c         d         e
0  0.945686  0.000710  0.909158  0.892892  0.326670
1  0.919359  0.667057  0.462478  0.008204  0.473096
2  0.976163  0.621712  0.208423  0.980471  0.048334
3  0.459039  0.788318  0.309892  0.100539  0.753992

我只想要那些列'c'的值大于0.5的行,但我只需要列'b'和'e'来表示这些行.

这是我提出的方法 - 也许有更好的"熊猫"方式?

locs = [df.columns.get_loc(_) for _ in ['a', 'd']]
print df[df.c > 0.5][locs]

          a         d
0  0.945686  0.892892

我的最终目标是将结果转换为numpy数组以传递给sklearn回归算法,因此我将使用上面的代码,如下所示:

training_set = array(df[df.c > 0.5][locs])

......因为我最终在内存中留下了一个巨大的数组副本,这让我感到很恼火.也许有更好的方法呢?

python arrays numpy pandas scikit-learn

42
推荐指数
3
解决办法
11万
查看次数

Clojure与Numpy的矩阵乘法

我正在使用Clojure中的一个应用程序,它需要繁殖大型矩阵,并且与相同的Numpy版本相比,遇到了一些大的性能问题.Numpy似乎能够在一秒钟内通过其转置乘以1,000,000x23矩阵,而等效的clojure代码需要超过六分钟.(我可以从Numpy打印出结果矩阵,所以它肯定会评估所有内容).

我在这个Clojure代码中做了哪些非常错误的事情?我可以尝试模仿Numpy的一些技巧吗?

这是python:

import numpy as np

def test_my_mult(n):
    A = np.random.rand(n*23).reshape(n,23)
    At = A.T

    t0 = time.time()
    res = np.dot(A.T, A)
    print time.time() - t0
    print np.shape(res)

    return res

# Example (returns a 23x23 matrix):
# >>> results = test_my_mult(1000000)
# 
# 0.906938076019
# (23, 23)
Run Code Online (Sandbox Code Playgroud)

和clojure:

(defn feature-vec [n]
  (map (partial cons 1)
       (for [x (range n)]
         (take 22 (repeatedly rand)))))

(defn dot-product [x y]
  (reduce + (map * x y)))

(defn transpose
  "returns the transposition of a …
Run Code Online (Sandbox Code Playgroud)

python numpy clojure matrix

41
推荐指数
6
解决办法
1万
查看次数

使用〜反转一个numpy布尔数组

我可以使用~A反转一个numpy数组的布尔值,而不是相当笨拙的函数np.logical_and()np.invert()?事实上,~似乎工作正常,但我找不到它的任何nympy参考手册,以及-更令人担忧的-它的确不能与标量工作(如bool(~True)退货True!),所以我有点担心...

python arrays boolean numpy invert

41
推荐指数
1
解决办法
3万
查看次数

从numpy python中的稀疏矩阵生成密集矩阵

我有一个Sqlite数据库,其中包含以下类型的架构:

termcount(doc_num, term , count)
Run Code Online (Sandbox Code Playgroud)

此表包含文档中各自计数的术语.喜欢

(doc1 , term1 ,12)
(doc1, term 22, 2)
.
.
(docn,term1 , 10)
Run Code Online (Sandbox Code Playgroud)

该矩阵可以被认为是稀疏矩阵,因为每个文档包含非常少的将具有非零值的项.

如何使用numpy从这个稀疏矩阵创建一个密集矩阵,因为我必须使用余弦相似度计算文档之间的相似性.

这个密集矩阵看起来像一个表格,其中docid作为第一列,所有条款都将列为第一行.剩余的单元格将包含计数.

python arrays numpy scipy sparse-matrix

41
推荐指数
2
解决办法
8万
查看次数

使用Matplotlib绘制正态分布

请帮我绘制下面数据的正态分布:

数据:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

h = [186, 176, 158, 180, 186, 168, 168, 164, 178, 170, 189, 195, 172,
     187, 180, 186, 185, 168, 179, 178, 183, 179, 170, 175, 186, 159,
     161, 178, 175, 185, 175, 162, 173, 172, 177, 175, 172, 177, 180]

std = np.std(h) 
mean = np.mean(h)    
plt.plot(norm.pdf(h,mean,std))
Run Code Online (Sandbox Code Playgroud)

输出:

Standard Deriviation = 8.54065575872 
mean = 176.076923077
Run Code Online (Sandbox Code Playgroud)

情节不正确,我的代码出了什么问题?

python plot numpy matplotlib scipy

40
推荐指数
2
解决办法
10万
查看次数

我可以使用Numpy得到矩阵行列式吗?

我在Numpy的手册中读到有det(M)可以计算行列式的函数.但是,我det()在Numpy 找不到方法.

顺便说一句,我使用Python 2.5.Numpy应该没有兼容性问题.

python arrays numpy

39
推荐指数
2
解决办法
6万
查看次数