有时将行或列向量"克隆"到矩阵是有用的.通过克隆我的意思是转换行向量,如
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
进入矩阵
[[1,2,3]
[1,2,3]
[1,2,3]
]
Run Code Online (Sandbox Code Playgroud)
或列向量,如
[1
2
3
]
Run Code Online (Sandbox Code Playgroud)
成
[[1,1,1]
[2,2,2]
[3,3,3]
]
Run Code Online (Sandbox Code Playgroud)
在matlab或octave中,这很容易完成:
x = [1,2,3]
a = ones(3,1) * x
a =
1 2 3
1 2 3
1 2 3
b = (x') * ones(1,3)
b =
1 1 1
2 2 2
3 3 3
Run Code Online (Sandbox Code Playgroud)
我想在numpy中重复这个,但没有成功
In [14]: x = array([1,2,3])
In [14]: ones((3,1)) * x
Out[14]:
array([[ 1., 2., 3.],
[ 1., 2., 3.],
[ 1., 2., 3.]])
# so far …Run Code Online (Sandbox Code Playgroud) 我在我的python代码中使用的第三方库(用C编写)发出警告.我希望能够使用try except语法来正确处理这些警告.有没有办法做到这一点?
在下面的代码中,我创建了一个基本抽象类Base.我希望所有继承的类都Base提供name属性,所以我创建了这个属性@abstractmethod.
然后我创建了一个Base名为的子类Base_1,它旨在提供一些功能,但仍然是抽象的.没有name属性Base_1,但是python会在没有错误的情况下实现该类的对象.如何创建抽象属性?
from abc import ABCMeta, abstractmethod
class Base(object):
__metaclass__ = ABCMeta
def __init__(self, strDirConfig):
self.strDirConfig = strDirConfig
@abstractmethod
def _doStuff(self, signals):
pass
@property
@abstractmethod
def name(self):
#this property will be supplied by the inheriting classes
#individually
pass
class Base_1(Base):
__metaclass__ = ABCMeta
# this class does not provide the name property, should raise an error
def __init__(self, strDirConfig):
super(Base_1, self).__init__(strDirConfig)
def _doStuff(self, signals): …Run Code Online (Sandbox Code Playgroud) Pandas DataFrame包含名为"date"包含非唯一datetime值的列.我可以使用以下方法对此帧中的行进行分组:
data.groupby(data['date'])
Run Code Online (Sandbox Code Playgroud)
但是,这会按datetime值拆分数据.我想按照"日期"列中存储的年份对这些数据进行分组.此页面显示如何在时间戳用作索引的情况下按年分组,在我的情况下不是这样.
我如何实现这种分组?
我想删除numpy.array中的选定列.这就是我做的:
n [397]: a = array([[ NaN, 2., 3., NaN],
.....: [ 1., 2., 3., 9]])
In [398]: print a
[[ NaN 2. 3. NaN]
[ 1. 2. 3. 9.]]
In [399]: z = any(isnan(a), axis=0)
In [400]: print z
[ True False False True]
In [401]: delete(a, z, axis = 1)
Out[401]:
array([[ 3., NaN],
[ 3., 9.]])
Run Code Online (Sandbox Code Playgroud)
在此示例中,我的目标是删除包含NaN的所有列.我希望最后一个命令导致:
array([[2., 3.],
[2., 3.]])
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我想模仿python中的pass-by-value行为.换句话说,我想确保我写的函数不会修改用户提供的数据.
一种可能的方法是使用深层复制:
from copy import deepcopy
def f(data):
data = deepcopy(data)
#do stuff
Run Code Online (Sandbox Code Playgroud)
是否有更高效或更pythonic的方式来实现这一目标,尽可能少地假设传递的对象(如.clone()方法)
编辑
我知道技术上python中的所有内容都是按值传递的.我有兴趣模仿行为,即确保我不会混淆传递给函数的数据.我想最常用的方法是使用自己的克隆机制或深度复制来克隆有问题的对象.
我正在玩Python的日志记录系统.我在循环中从Logger对象中删除处理程序时发现了一个奇怪的行为.也就是说,我的for循环删除了除一个处理程序以外 额外调用以.removeHandler顺利删除最后一个处理程序.呼叫期间不会发出任何错误消息.
这是测试代码:
import logging
import sys
logging.basicConfig()
dbg = logging.getLogger('dbg')
dbg.setLevel(logging.DEBUG)
testLogger = logging.getLogger('mylogger')
sh = logging.StreamHandler(sys.stdout)
fh = logging.FileHandler('mylogfile.log')
dbg.debug('before adding handlers: %d handlers'%len(testLogger.handlers))
testLogger.addHandler(fh)
testLogger.addHandler(sh)
dbg.debug('before removing. %d handlers: %s'%(len(testLogger.handlers),
str(testLogger.handlers)))
for h in testLogger.handlers:
dbg.debug('removing handler %s'%str(h))
testLogger.removeHandler(h)
dbg.debug('%d more to go'%len(testLogger.handlers))
#HERE I EXPECT THAT NO HANDLER WILL REMAIN
dbg.debug('after removing: %d handlers: %s'%(len(testLogger.handlers),
str(testLogger.handlers)))
if len(testLogger.handlers) > 0:
#Why is this happening?
testLogger.removeHandler(testLogger.handlers[0])
dbg.debug('after manually removing the last handler: %d handlers'%len(testLogger.handlers))
Run Code Online (Sandbox Code Playgroud)
我希望在循环结束时没有处理程序将保留在 …
我无法弄清楚如何在python中使用Pandas进行"反向融化".这是我的起始数据
import pandas as pd
from StringIO import StringIO
origin = pd.read_table(StringIO('''label type value
x a 1
x b 2
x c 3
y a 4
y b 5
y c 6
z a 7
z b 8
z c 9'''))
origin
Out[5]:
label type value
0 x a 1
1 x b 2
2 x c 3
3 y a 4
4 y b 5
5 y c 6
6 z a 7
7 z b 8
8 z …Run Code Online (Sandbox Code Playgroud) 我需要逐步填充列表或列表元组.看起来像这样的东西:
result = []
firstTime = True
for i in range(x):
for j in someListOfElements:
if firstTime:
result.append([f(j)])
else:
result[i].append(j)
Run Code Online (Sandbox Code Playgroud)
为了使它更简洁更优雅,我想我会预先分配一个空列表列表
result = createListOfEmptyLists(x)
for i in range(x):
for j in someListOfElements:
result[i].append(j)
Run Code Online (Sandbox Code Playgroud)
预分配部分对我来说并不明显.当我这样做时result = [[]] * x,我收到一个x对同一列表的引用列表,以便输出如下
result[0].append(10)
print result
Run Code Online (Sandbox Code Playgroud)
是:
[[10], [10], [10], [10], [10], [10], [10], [10], [10], [10]]
Run Code Online (Sandbox Code Playgroud)
我可以使用loop(result = [[] for i in range(x)]),但我想知道是否存在"无循环"解决方案.
是获得我正在寻找的唯一方法
以下代码无法在Python 2.5.4上运行:
from matplotlib import pylab as pl
import numpy as np
data = np.random.rand(6,6)
fig = pl.figure(1)
fig.clf()
ax = fig.add_subplot(1,1,1)
ax.imshow(data, interpolation='nearest', vmin=0.5, vmax=0.99)
pl.colorbar()
pl.show()
Run Code Online (Sandbox Code Playgroud)
错误消息是
C:\temp>python z.py
Traceback (most recent call last):
File "z.py", line 10, in <module>
pl.colorbar()
File "C:\Python25\lib\site-packages\matplotlib\pyplot.py", line 1369, in colorbar
ret = gcf().colorbar(mappable, cax = cax, ax=ax, **kw)
File "C:\Python25\lib\site-packages\matplotlib\figure.py", line 1046, in colorbar
cb = cbar.Colorbar(cax, mappable, **kw)
File "C:\Python25\lib\site-packages\matplotlib\colorbar.py", line 622, in __init__
mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax
AttributeError: …Run Code Online (Sandbox Code Playgroud)