我重新打开笔记本时通常必须重新运行(大多数部分)笔记本,以便访问以前定义的变量并继续工作.
但是,有时我想跳过一些对后续细胞没有影响的细胞(例如,它们可能包含完成的分析分支)并且可能需要很长时间才能运行.这些细胞可以分散在整个笔记本中,因此像"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$'))
我有一长串的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) 我在没有Internet访问的Windows机器上使用Anaconda Python发行版.
安装非常简单:只需下载并复制Anaconda Windows安装程序并以标准方式安装即可.
但是在更新方面:
可以运行类似的东西:
conda update Anaconda-2.2.0-Windows-x86_64.exe
Run Code Online (Sandbox Code Playgroud)
从一体化Windows安装程序中提取和更新必要的包?
我注意到--offline最新conda update命令提供的新选项,但它似乎没有用于此目的......
更新: 在最新版本的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)
是找出最长字符串长度的另一种方法,这一步似乎是不可避免的......
我有三个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) 在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的答案的评论)是,在这个特殊情况下,这两个图本身实际上由数十个小子图组成,加上一些额外的格式/标记.将它们合并为一个更大的子图阵列并非易事......
>>> 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)
我知道浮点表示的局限性.只是好奇为什么更笨拙的表达似乎给出"更好"的结果.
MXNet 和 PyTorch 都提供了计算 log 的特殊实现(softmax()),速度更快,数值更稳定。但是,我在这两个包中都找不到该函数 log_softmax() 的实际 Python 实现。
谁能解释一下这是如何实现的,或者更好的是,给我指出相关的源代码?
python ×8
numpy ×3
ipython ×2
anaconda ×1
installation ×1
matplotlib ×1
mxnet ×1
performance ×1
pytorch ×1
scipy ×1
string ×1
unicode ×1
updates ×1