我正在尝试将二维数组转换为带有命名字段的结构化数组.我希望2D数组中的每一行都是结构化数组中的新记录.不幸的是,我所尝试的一切都没有按照我的预期进行.
我开始时:
>>> myarray = numpy.array([("Hello",2.5,3),("World",3.6,2)])
>>> print myarray
[['Hello' '2.5' '3']
['World' '3.6' '2']]
Run Code Online (Sandbox Code Playgroud)
我想转换为看起来像这样的东西:
>>> newarray = numpy.array([("Hello",2.5,3),("World",3.6,2)], dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[('Hello', 2.5, 3L) ('World', 3.6000000000000001, 2L)]
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
>>> newarray = myarray.astype([("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
[('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', 0.0, 0L)]]
>>> newarray = numpy.array(myarray, dtype=[("Col1","S8"),("Col2","f8"),("Col3","i8")])
>>> print newarray
[[('Hello', 0.0, 0L) ('2.5', 0.0, 0L) ('3', 0.0, 0L)]
[('World', 0.0, 0L) ('3.6', 0.0, 0L) ('2', …Run Code Online (Sandbox Code Playgroud) 我每次对属性进行更改时都使用属性来执行某些代码,如下所示:
class SomeClass(object):
def __init__(self,attr):
self._attr = attr
@property
def attr(self):
return self._attr
@attr.setter
def attr(self,value):
if self._attr != value:
self._on_change()
self._attr = value
def _on_change(self):
print "Do some code here every time attr changes"
Run Code Online (Sandbox Code Playgroud)
这非常有用:
>>> a = SomeClass(5)
>>> a.attr = 10
Do some code here every time attr changes
Run Code Online (Sandbox Code Playgroud)
但是如果我存储了一个可变对象attr,attr可以直接修改,绕过setter和我的更改检测代码:
class Container(object):
def __init__(self,data):
self.data = data
>>> b = SomeClass(Container(5))
>>> b.attr.data = 10
>>>
Run Code Online (Sandbox Code Playgroud)
让我们假设它attr只会用于存储类型的对象Container.是否有修改一个优雅的方式SomeClass和/或 …
这似乎是一个简单的问题,但我找不到一个好的答案.
我正在寻找一种pythonic方法来测试2d numpy数组是否包含给定行.例如:
myarray = numpy.array([[0,1],
[2,3],
[4,5]])
myrow1 = numpy.array([2,3])
myrow2 = numpy.array([2,5])
myrow3 = numpy.array([0,3])
myrow4 = numpy.array([6,7])
Run Code Online (Sandbox Code Playgroud)
给定myarray,我想编写一个函数,如果我测试myrow1则返回True,如果我测试myrow2,myrow3和myrow4则返回False.
我尝试了"in"关键字,它没有给我我预期的结果:
>>> myrow1 in myarray
True
>>> myrow2 in myarray
True
>>> myrow3 in myarray
True
>>> myrow4 in myarray
False
Run Code Online (Sandbox Code Playgroud)
它似乎只检查一个或多个元素是否相同,而不是所有元素都相同.有人可以解释为什么会这样吗?
我可以逐个元素执行此测试,如下所示:
def test_for_row(array,row):
numpy.any(numpy.logical_and(array[:,0]==row[0],array[:,1]==row[1]))
Run Code Online (Sandbox Code Playgroud)
但这并不是非常pythonic,如果行有很多元素会变得有问题.必须有一个更优雅的解决方案.任何帮助表示赞赏!
我正在尝试编写一个具有动态属性的类.考虑以下具有两个只读属性的类:
class Monster(object):
def __init__(self,color,has_fur):
self._color = color
self._has_fur = has_fur
@property
def color(self): return self._color
@property
def has_fur(self): return self._has_fur
Run Code Online (Sandbox Code Playgroud)
我想概括这一点,以便__init__可以使用任意字典并从字典中的每个项创建只读属性.我可以这样做:
class Monster2(object):
def __init__(self,traits):
self._traits = traits
for key,value in traits.iteritems():
setattr(self.__class__,key,property(lambda self,key=key: self._traits[key]))
Run Code Online (Sandbox Code Playgroud)
但是,这有一个严重的缺点:每次我创建一个新实例时Monster,我实际上是在修改Monster类.Monster我没有为我的新实例创建属性,而是有效地向所有实例添加属性Monster.看到这个:
>>> hasattr(Monster2,"height")
False
>>> hasattr(Monster2,"has_claws")
False
>>> blue_monster = Monster2({"height":4.3,"color":"blue"})
>>> hasattr(Monster2,"height")
True
>>> hasattr(Monster2,"has_claws")
False
>>> red_monster = Monster2({"color":"red","has_claws":True})
>>> hasattr(Monster2,"height")
True
>>> hasattr(Monster2,"has_claws")
True
Run Code Online (Sandbox Code Playgroud)
这当然是有道理的,因为我明确地将属性添加为类属性setattr(self.__class__,key,property(lambda self,key=key: self._traits[key])).我需要的是可以添加到实例的属性.(即"实例属性").不幸的是,根据我阅读和尝试的所有内容,属性始终是类属性,而不是实例属性.例如,这不起作用: …
我试图挑选一个自定义类的实例,这个类有一个名为"widgets"的属性,它包含一个widget对象列表.当我腌制我的容器时,列表就丢失了.是不是可以在对象中挑选一个列表?
import pickle
filename = 'container.pkl'
class Container(object):
widgets = []
class Widget(object):
pass
c = Container()
c.name = "My Container"
w = Widget()
w.name = "My Widget"
c.widgets.append(w)
data = open(filename, 'wb')
pickle.dump(c, data)
data.close()
Run Code Online (Sandbox Code Playgroud)
后来我试着破坏...
# assume I have imported the classes and filename here
data = open(filename, 'rb')
container = pickle.load(data)
data.close()
print container.name # shows the pickled name
print container.widgets # shows []
Run Code Online (Sandbox Code Playgroud)
我尝试了pickle和cPickle同样的结果.