小编Ero*_*mic的帖子

64位窗口上的Python 32位内存限制

我遇到了一个我似乎无法理解的记忆问题.

我在Windows 7 64位机器上运行8GB内存并运行32位python程序.

这些程序读取了5,118个压缩的numpy文件(npz).Windows报告磁盘上的文件占用1.98 GB

每个npz文件包含两个数据:'arr_0'的类型为np.float32,'arr_1'的类型为np.uint8

python脚本读取每个文件将其数据附加到两个列表中,然后关闭该文件.

在文件4284/5118周围,程序抛出一个MemoryException

但是,任务管理器说发生错误时python.exe*32的内存使用量是1,854,848K~ = 1.8GB.远低于我的8 GB限制,或者假定的32位程序的4GB限制.

在程序中我捕获内存错误并报告:每个列表的长度为4285.第一个列表包含总共1,928,588,480个float32的〜= 229.9 MB的数据.第二个列表包含12,342,966,272 uint8的〜= 1,471.3MB数据.

所以,一切似乎都在检查.除了我得到内存错误的部分.我绝对有更多的内存,它崩溃的文件大约是800KB,因此读取一个巨大的文件并没有失败.

此外,该文件未损坏.如果我事先没有耗尽所有的记忆,我可以读得很好.

为了让事情变得更加混乱,所有这一切似乎在我的Linux机器上运行良好(虽然它确实有16GB的内存,而不是我的Windows机器上的8GB),但是,它似乎并不是机器的RAM.造成这个问题.

为什么Python会抛出内存错误,当我预计它应该能够分配另外2GB的数据?

python memory windows file-io numpy

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

如何将IPython Interpreter嵌入到在IPython Qt控制台中运行的应用程序中

关于这一点有一些主题,但没有一个有令人满意的答案.

我有一个在IPython qt控制台中运行的python应用程序

http://ipython.org/ipython-doc/dev/interactive/qtconsole.html

当我遇到错误时,我希望能够在那时与代码进行交互.

    try: 
      raise Exception()
    except Exception as e:
        try: # use exception trick to pick up the current frame
            raise None
        except:
            frame = sys.exc_info()[2].tb_frame.f_back
        namespace = frame.f_globals.copy()
        namespace.update(frame.f_locals)
        import IPython
        IPython.embed_kernel(local_ns=namespace)  
Run Code Online (Sandbox Code Playgroud)

我认为这会奏效,但我收到一个错误:

RuntimeError:线程只能启动一次

ipython python-2.7 qtconsole

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

我可以从其内存地址获取python对象吗?

我正在学习如何将Qt与PyQt一起使用,我有一个带有StandardItemModel的QTabelView我已成功填充模型并将itemChanged信号连接到一个插槽.我想乱搞IPython中返回的任何对象,所以目前我有这条线:

def itemChangedSlot(epw, item):
    new_data = item.data()
    print new_data
    print item
Run Code Online (Sandbox Code Playgroud)

打印

<PyQt4.QtGui.QStandardItem object at 0x07C5F930>
<PyQt4.QtCore.QVariant object at 0x07D331F0>
Run Code Online (Sandbox Code Playgroud)

在IPython会话中是否可以使用此内存地址获取对象?我在Google上没有看到任何内容,也许我没有正确的术语?

python ipython pyqt4 dereference

12
推荐指数
3
解决办法
8844
查看次数

为什么numpy.core.numeric._typelessdata中有两个np.int64(为什么numpy.int64不是numpy.int64?)

这不是一个好奇心问题.

在我的64位Linux解释器上,我可以执行

In [10]: np.int64 == np.int64
Out[10]: True

In [11]: np.int64 is np.int64
Out[11]: True
Run Code Online (Sandbox Code Playgroud)

太棒了,正是我所期待的.但是我发现了numpy.core.numeric模块的这个奇怪的属性

In [19]: from numpy.core.numeric import _typelessdata

In [20]: _typelessdata
Out[20]: [numpy.int64, numpy.float64, numpy.complex128, numpy.int64]
Run Code Online (Sandbox Code Playgroud)

很奇怪为什么numpy.int64在那里两次?让我们调查一下

In [23]: _typelessdata[0] is _typelessdata[-1]
Out[23]: False
In [24]: _typelessdata[0] == _typelessdata[-1]
Out[24]: False
In [25]: id(_typelessdata[-1])
Out[25]: 139990931572128
In [26]: id(_typelessdata[0])
Out[26]: 139990931572544
In [27]: _typelessdata[-1]
Out[27]: numpy.int64
In [28]: _typelessdata[0]
Out[28]: numpy.int64
Run Code Online (Sandbox Code Playgroud)

哇他们是不同的.这里发生了什么?为什么有两个np.int64?

python numpy

11
推荐指数
1
解决办法
296
查看次数

Python的OpenCV cv2.imread总是返回None而cvFeatDetector崩溃了python

我在python中使用opencv弄湿了,我觉得一个好的开始就是加载一个图像.

我在我的系统上构建了opencv,并在目录tpl/opencv中有python绑定和opencv dll,这与我的项目有关.

以下是一些演示此问题的代码:

from tpl.opencv import cv2
from tpl.opencv.cv2 import cv
from PIL import Image

pil_img =  Image.open('C:/test_file.jpg') #Read a temp file, the input is actually a computed image chip
tmpname =  'C:/tmp.png' 
pil_img.save(tmpname,'PNG') # Write the image chip to disk

im  = cv.LoadImage(tmpname) # This seems to work
im2 = cv2.imread(tmpname)   # This always returns None
Run Code Online (Sandbox Code Playgroud)

没有错误消息,im2总是无.我可以用我导入opencv的方式搞砸了吗?有一个简单的解决方法吗?

当我创造

 cvFeatDetector  = cv2.FeatureDetector_create("MSER")
Run Code Online (Sandbox Code Playgroud)

我知道,所以cv2的一部分似乎有效


作为一种解决方法,我只是用numpy加载图像

        im2 = numpy.imread(inname)
        im  = cv2.cvtColor(im2, cv2.COLOR_BGR2GRAY) # This works. I was able to imshow …
Run Code Online (Sandbox Code Playgroud)

python opencv

10
推荐指数
1
解决办法
5169
查看次数

有没有一种简单的方法可以在python中从一个不平等的句子生成一个可能的单词列表?

我有一些文字:

 s="Imageclassificationmethodscan beroughlydividedinto two broad families of approaches:"
Run Code Online (Sandbox Code Playgroud)

我想把它解析成单词.我很快调查了附魔和nltk,但没有看到任何看起来立即有用的东西.如果我有时间投入这个,我会考虑编写一个动态程序,附魔能够检查一个单词是否是英语.我原以为在网上有什么可以做的,我错了吗?

python nlp

10
推荐指数
1
解决办法
473
查看次数

是否可以在进程之间传递Python Future对象?

根据我的实验,我猜这个答案是否定的.但也许有可能对期货模块进行一些改变.

我想提交一个自己创建执行者并提交工作的工人.我想把第二个未来归还给主流程.我有这个MWE,它不起作用,因为f2当它通过多处理发送时,对象可能会与其父执行器解除关联.(如果两个执行程序都是ThreadPoolExecutor,它确实有效,因为f2永远不会复制该对象).

from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
import time

def job1():
    try:
        ex2 = ThreadPoolExecutor()
        time.sleep(2)
        f2 = ex2.submit(job2)
    finally:
        ex2.shutdown(wait=False)
    return f2

def job2():
    time.sleep(2)
    return 'done'

try:
    ex1 = ProcessPoolExecutor()
    f1 = ex1.submit(job1)
finally:
    ex1.shutdown(wait=False)

print('f1 = {!r}'.format(f1))
f2 = f1.result()
print('f1 = {!r}'.format(f1))
print('f2 = {!r}'.format(f2))
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否有任何安全的方法可以在多处理管道中发送未来的对象,并且能够在完成后接收该值.看起来我可能需要设置另一个类似于执行器的构造,用于侦听另一个管道上的结果.

python concurrent.futures

10
推荐指数
1
解决办法
620
查看次数

使用Numpy数组的Pandas MultiIndex查找

我正在使用代表图表的pandas DataFrame.数据帧由指示节点端点的MultiIndex索引.

建立:

import pandas as pd
import numpy as np
import itertools as it
edges = list(it.combinations([1, 2, 3, 4], 2))

# Define a dataframe to represent a graph
index = pd.MultiIndex.from_tuples(edges, names=['u', 'v'])
df = pd.DataFrame.from_dict({
    'edge_id': list(range(len(edges))),
    'edge_weight': np.random.RandomState(0).rand(len(edges)),
})
df.index = index
print(df)
## -- End pasted text --
     edge_id  edge_weight
u v                      
1 2        0       0.5488
  3        1       0.7152
  4        2       0.6028
2 3        3       0.5449
  4        4       0.4237
3 4        5       0.6459
Run Code Online (Sandbox Code Playgroud)

我希望能够使用边缘子集索引图形,这就是我选择使用a的原因MultiIndex …

python numpy pandas

9
推荐指数
1
解决办法
676
查看次数

Matplotlib 渲染所有内部体素(带 alpha)

我想在 matplotlib 中渲染一个体积。体积是一个简单的 7x7x7 立方体,我希望能够看到所有内部体素(即使我知道它看起来会一团糟)。

在此处输入图片说明我已经能够渲染具有透明度的体素,但似乎永远不会绘制任何不在表面上的体素。

卷的每个 7x7 切片应如下所示: 在此处输入图片说明

我拼凑了一个 MWE

以下代码创建了一个 5x5x5 的体积,其中包含红色、绿色、蓝色、黄色和青色 5x5 层。每层的 alpha 设置为 0.5,所以整个东西应该是透明的。

然后我将所有非表面体素的颜色更改为带有 alpha 1 的黑色,因此如果它们正在显示,我们应该能够在中心看到一个黑框。

自己渲染它会产生左边的图,但是如果我们从青色层中移除填充,我们可以看到黑框确实存在,只是没有显示出来,因为即使那些遮挡体素,它也被 100% 遮挡了alpha 小于 1。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  # NOQA

spatial_axes = [5, 5, 5]
filled = np.ones(spatial_axes, dtype=np.bool)

colors = np.empty(spatial_axes + [4], dtype=np.float32)
alpha = .5
colors[0] = [1, 0, 0, alpha]
colors[1] = [0, 1, 0, alpha]
colors[2] = [0, 0, 1, alpha]
colors[3] = [1, 1, 0, alpha] …
Run Code Online (Sandbox Code Playgroud)

python matplotlib

9
推荐指数
1
解决办法
4847
查看次数

PyQt4强制从QAbstractItemModel查看fetchMore

我有一个QTableView,可以动态加载来自继承QAbstractItemModel的自定义模型的数据.该模型实现了fetchMore和canFetchMore.

问题是我希望能够为小数据集选择所有行,但如果我在视图中点击ctrl-a,它只会选择当前加载的行.

是否有某种机制强制QTableView获取更多行?理想情况下,我想显示一个进度条,指示从模型加载的数据部分.每隔几秒钟我就想强制模型加载更多的数据,但我仍然希望让用户与目前已加载的数据进行交互.这样,当进度条完成时,用户可以按ctrl-a并确信所有数据都已被选中.


编辑:我有另一个激励用例.我想跳转到特定的行,但如果没有加载该行,我的界面什么都不做.

如何强制QAbstractItemModel获取更多(或特定行),然后强制QTableView显示它?

如果我没有实现fetchMore和canFetchMore,之前的功能可以正常工作,但加载表格非常慢.当我实现这些方法时,情况正好相反.没有这个问题的答案导致我的qt界面的可用性问题,所以我正在为这个问题打开奖金.

这是我用来选择特定行的方法.

def select_row_from_id(view, _id, scroll=False, collapse=True):
    """
        _id is from the iders function (i.e. an ibeis rowid)
        selects the row in that view if it exists
    """
    with ut.Timer('[api_item_view] select_row_from_id(id=%r, scroll=%r, collapse=%r)' %
                  (_id, scroll, collapse)):
        qtindex, row = view.get_row_and_qtindex_from_id(_id)
        if row is not None:
            if isinstance(view, QtWidgets.QTreeView):
                if collapse:
                    view.collapseAll()
                select_model = view.selectionModel()
                select_flag = QtCore.QItemSelectionModel.ClearAndSelect
                #select_flag = QtCore.QItemSelectionModel.Select
                #select_flag = QtCore.QItemSelectionModel.NoUpdate
                with ut.Timer('[api_item_view] selecting name. qtindex=%r' % (qtindex,)):
                    select_model.select(qtindex, select_flag)
                with ut.Timer('[api_item_view] …
Run Code Online (Sandbox Code Playgroud)

python qt pyqt qtableview qabstractitemmodel

8
推荐指数
1
解决办法
867
查看次数