小编her*_*h10的帖子

如何(间歇性地)在运行IPython笔记本时跳过某些单元格?

我重新打开笔记本时通常必须重新运行(大多数部分)笔记本,以便访问以前定义的变量并继续工作.

但是,有时我想跳过一些对后续细胞没有影响的细胞(例如,它们可能包含完成的分析分支)并且可能需要很长时间才能运行.这些细胞可以分散在整个笔记本中,因此像"Run All Below"这样的东西也无济于事.

有没有办法实现这个目标?

理想情况下,这些单元格可以使用一些特殊标记进行标记,以便它们可以手动"运行",但在"全部运行"时将被跳过.

编辑

%%cache (@ ipak扩展)@Jakob建议在某种程度上解决了这个问题.

实际上,我甚至不需要在重新运行时加载任何变量(对于后续单元格而言可能很大但不必要),只有存储的输出才能作为分析结果.

作为一种解决方案,放在%%cache folder/unique_identifier细胞的开头.代码将只执行一次,重新运行时不会加载任何变量,除非您删除unique_identifier文件.

不幸的是,当重新运行时,所有输出结果都会丢失%%cache.

编辑II(2013年10月14日)

ipython + ipycache的主版本现在也会修改(并重新显示)codecell输出.

对于丰富的显示输出,包括Latex,HTML(pandas DataFrame输出),请记住使用IPython的display()方法,例如, display(Latex(r'$\alpha_1$'))

python ipython ipython-notebook ipython-magic

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

为什么将长2D列表转换为numpy数组这么慢?

我有一长串的xy坐标,并希望将其转换为numpy数组.

>>> import numpy as np
>>> xy = np.random.rand(1000000, 2).tolist()
Run Code Online (Sandbox Code Playgroud)

显而易见的方法是:

>>> a = np.array(xy) # Very slow...
Run Code Online (Sandbox Code Playgroud)

但是,上面的代码非常慢.有趣的是,首先转换长列表,将其转换为numpy数组,然后转置回来会更快(我的笔记本电脑上的20倍).

>>> def longlist2array(longlist):
...     wide = [[row[c] for row in longlist] for c in range(len(longlist[0]))]
...     return np.array(wide).T
>>> a = longlist2array(xy) # 20x faster!
Run Code Online (Sandbox Code Playgroud)

这是一个numpy的错误吗?

编辑:

这是一个动态生成的点(带有xy坐标)的列表,因此不是预先分配数组并在必要时放大它,或者为x和y维护两个1D列表,我认为当前表示是最自然的.

为什么循环遍历第二个索引比第一个索引更快,因为我们在两个方向上遍历python列表?

编辑2:

根据@ tiago的回答和这个问题,我发现以下代码的速度是原始版本的两倍:

>>> from itertools import chain
>>> def longlist2array(longlist):
...     flat = np.fromiter(chain.from_iterable(longlist), np.array(longlist[0][0]).dtype, -1) # Without intermediate list:)
...     return flat.reshape((len(longlist), -1))
Run Code Online (Sandbox Code Playgroud)

python performance numpy

18
推荐指数
2
解决办法
5871
查看次数

如何在Windows中脱机更新整个Anaconda Python发行版?

我在没有Internet访问的Windows机器上使用Anaconda Python发行版.

安装非常简单:只需下载并复制Anaconda Windows安装程序并以标准方式安装即可.

但是在更新方面:

  • 如果我手动下载,复制和更新单个软件包,考虑到软件包之间复杂的相互依赖性,这是繁琐且容易出错的.
  • 如果我卸载整个Anaconda,然后重新安装一个新的Anaconda(我当前的方法),我将丢失我的个人配置以及手动安装的包,这些包不包含在Anaconda安装程序中.

可以运行类似的东西:

conda update Anaconda-2.2.0-Windows-x86_64.exe
Run Code Online (Sandbox Code Playgroud)

从一体化Windows安装程序中提取和更新必要的包?

我注意到--offline最新conda update命令提供的新选项,但它似乎没有用于此目的......

python installation updates anaconda

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

如何将numpy对象数组转换为str/unicode数组?

更新: 在最新版本的numpy(例如,v1.8.1)中,这不再是一个问题.这里提到的所有方法现在都是例外.

原始问题: 有时使用对象dtype存储字符串数组很方便,特别是当需要修改大数组的内容而不事先了解字符串的最大长度时,例如,

>>> import numpy as np
>>> a = np.array([u'abc', u'12345'], dtype=object)
Run Code Online (Sandbox Code Playgroud)

在某些时候,人们可能想要将dtype转换回unicode或str.但是,简单的转换会截断长度为4或1的字符串(为什么?),例如,

>>> b = np.array(a, dtype=unicode)
>>> b
array([u'abc', u'1234'], dtype='<U4')
>>> c = a.astype(unicode)
>>> c
array([u'a', u'1'], dtype='<U1')
Run Code Online (Sandbox Code Playgroud)

当然,可以总是显式迭代整个数组以确定最大长度,

>>> d = np.array(a, dtype='<U{0}'.format(np.max([len(x) for x in a])))
array([u'abc', u'12345'], dtype='<U5')
Run Code Online (Sandbox Code Playgroud)

然而,在我看来,这有点尴尬.有一个更好的方法吗?

编辑添加: 根据这个密切相关的问题,

>>> len(max(a, key=len))
Run Code Online (Sandbox Code Playgroud)

是找出最长字符串长度的另一种方法,这一步似乎是不可避免的......

python string numpy type-conversion

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

如何控制包含东亚字符的Unicode字符串的填充

我有三个UTF-8蜇伤:

hello, world
hello, ??
hello, ?rld
Run Code Online (Sandbox Code Playgroud)

我只想要前10个ascii-char-width,以便括号在一列中:

[hello, wor]
[hello, ? ]
[hello, ?r]
Run Code Online (Sandbox Code Playgroud)

在控制台中:

width('??')==width('worl')
width('? ')==width('wor')  #a white space behind '?'
Run Code Online (Sandbox Code Playgroud)

一个中文字符是三个字节,但在控制台中显示时只有2个ascii字符宽度:

>>> bytes("hello, ??", encoding='utf-8')
b'hello, \xe4\xb8\x96\xe7\x95\x8c'
Run Code Online (Sandbox Code Playgroud)

format()当UTF-8字符混入时,python 没有帮助

>>> for s in ['[{0:<{1}.{1}}]'.format(s, 10) for s in ['hello, world', 'hello, ??', 'hello, ?rld']]:
...    print(s)
...
[hello, wor]
[hello, ?? ]
[hello, ?rl]
Run Code Online (Sandbox Code Playgroud)

它不漂亮:

 -----------Songs-----------
|    1: ??                  |
|    2: ???                 |
|    3: ??????              |
|    4: ?????               |
|    5: ???(CUCURRUCUCU …
Run Code Online (Sandbox Code Playgroud)

python unicode string-formatting

7
推荐指数
3
解决办法
2986
查看次数

如何在ipython笔记本中使用matplotlib内联时禁用bbox_inches ='tight'

在ipython笔记本中使用matplotlib内联后端时,默认行为是使用bbox_inches ='tight'通过savefig()在内部生成嵌入式png图像.这消除了轴周围的空白,并且在大多数情况下都很好.

但是,有时人们可能希望(暂时)禁用此功能,例如,当他想手动保持两个数字垂直对齐时(假设我们不想在这里使用子图):

%matplotlib inline
from pylab import *
plot(rand(100))
subplots_adjust(left=0.2) # Has no effect with inline, but works as expected with qt
figure()
plot(rand(100)*10000) # Will result in a larger left margin for this figure...
subplots_adjust(left=0.2)
Run Code Online (Sandbox Code Playgroud)

那么如何禁用这种行为呢?谢谢〜

编辑

为了使这里涉及的问题更加明确(感谢Anzel),由于更多数字将在yticklabels中显示,因此在bbox_inches ='紧密触发的自动布局调整后,左边距会更大(右边距更小) savefig()中的选项,由notebook在内部调用以生成嵌入式png输出.它将有效地截断我故意用subplots_adjust()创建的任何额外空间,这样第二个数字似乎会向右移动,而不是与第一个数字垂直"对齐".

很容易看出我的意思---只需尝试上面的代码片段:)

我之前没有使用子图/子图的原因(参见Anzel的答案的评论)是,在这个特殊情况下,这两个图本身实际上由数十个小子图组成,加上一些额外的格式/标记.将它们合并为一个更大的子图阵列并非易事......

python matplotlib ipython ipython-notebook

5
推荐指数
2
解决办法
943
查看次数

为什么scipy.stats.nanmean会给出numpy.nansum不同的结果?

>>> import numpy as np
>>> from scipy import stats
>>> a = np.r_[1., 2., np.nan, 4., 5.]
>>> stats.nanmean(a)
2.9999999999999996
>>> np.nansum(a)/np.sum(~np.isnan(a))
3.0
Run Code Online (Sandbox Code Playgroud)

我知道浮点表示的局限性.只是好奇为什么更笨拙的表达似乎给出"更好"的结果.

python floating-point numpy scipy floating-point-precision

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

log_softmax() 如何实现以更快的速度和数值稳定性计算其值(和梯度)?

MXNet 和 PyTorch 都提供了计算 log 的特殊实现(softmax()),速度更快,数值更稳定。但是,我在这两个包中都找不到该函数 log_softmax() 的实际 Python 实现。

谁能解释一下这是如何实现的,或者更好的是,给我指出相关的源代码?

python machine-learning numerical-methods mxnet pytorch

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