【问题标题】:python- access to variables given conditionspython-在给定条件下访问变量
【发布时间】:2015-07-05 01:51:38
【问题描述】:

我是 R 用户,所以我习惯于使用数据框访问数据,使用 data[data$variable=='condition',] 方式中的条件。 我正在尝试在 python 中编写一个简单的概率神经网络示例。 如果我的数据是:

data = {'o' : [(0.2, 0.5), (0.5, 0.7)],
        'x' : [(0.8, 0.8), (0.4, 0.5)],
        'i' : [(0.8, 0.5), (0.6, 0.3), (0.3, 0.2)]}

我想对一条新记录进行分类:

nuevo=(0.2, 0.6)

我设法编写了以下代码,该代码在每次打印时创建了一个表格(列表列表),以查看发生了什么...

kk=[]

def g (data, nuevo):

    for k in data:
        print(k)        
        j=-1
        for i in data[k]:         
            j=j+1
            print(i)        
            print(i[0])
            print(i[1])
            kk.append([k,i,math.e ** (-1 *((nuevo[0] - i[0]) ** 2 + (nuevo[1] - i[1]) ** 2) / ((2 * (0.1 ** 2))))])
            print(kk[j])

g(data, nuevo)

最后我有 kk 列表列表,我需要选择每个 o、x 和 i 的最大值。然后选择具有最大值的那个。

我尝试了类似kk[kk[][0]=='o'] 的方法来获取所有带有“o”的元素,但我得到了错误的结果。这一定很简单,但我无法以更简单的方式看到它(我不想使用循环)。

【问题讨论】:

  • Python 的内置结构不是这样设置的。它们不强制执行表格结构,因此 Python 不知道或关心结构中的所有“列”是否甚至具有相同的长度。同样,矢量化操作(没有循环)是不可能的,因为不要求您存储的所有值都具有相同的类型。如果你想做 R 风格的东西,我建议你看看 pandas 库,它提供了类似于 R 的向量和数据帧的数据结构。
  • 好的,谢谢。但是如果你必须用基础来解决它,你会怎么做呢?也许利用形成 kk 列表的循环?
  • @GabrielaPlantie 你也许可以使用list comprehensions 来获得你想要的东西。简单示例:[x for x in range(100) if x % 2 == 0]
  • 我不完全确定您要做什么。如果要过滤列表以仅获取满足某个谓词的值,可以使用filter 函数。
  • @GabrielaPlantie:没有循环的基础知识是做不到的。

标签: python list


【解决方案1】:

您可以使用 列表理解

简化您的函数 g
def g(d,n):
    return [[k,i,exp(-50*((n[0]-i[0])**2+(n[1]-i[1])**2))] for k in d for i in d[k]]

我敢说,使用函数来修改全局数据结构并不总是可能的最佳解决方案......

也就是说,您想为每个类别选择最大接近度,所以

def max_p(d, p):
    return [max((x for x in p if x[0]==k), key=lambda x: x[2]) for k in d]

再次,列表理解(数据字典 d 中每个键 k 的列表元素)和一个新事物,生成器表达式,即 (x for x in p if x[0]==k) 部分;生成器表达式每次都会给出一个元素,即计算出的与 max 内置函数的接近度列表中的所有元素。

max 函数的第二个参数是一个计算排序键的函数,这里key=lambda x: x[2]) 是一个使用lambda 语法在现场定义的函数,它返回索引为 2 的内部元素。

In [49]: data = {'o' : [(0.2, 0.5), (0.5, 0.7)],
        'x' : [(0.8, 0.8), (0.4, 0.5)],
        'i' : [(0.8, 0.5), (0.6, 0.3), (0.3, 0.2)]}

In [50]: nuevo = (0.2, 0.6)

In [51]: def g(d,n):
    return [[k,i,exp(-50*((n[0]-i[0])**2+(n[1]-i[1])**2))] for k in d for i in d[k]]
   ....: 

In [52]: def max_p(d, p):
    return [max((x for x in p if x[0]==k), key=lambda x: x[2]) for k in d]
   ....: 

In [53]: max_p(data, g(data, nuevo))
Out[53]: 
[['i', (0.3, 0.2), 0.00020346836901064417],
 ['x', (0.4, 0.5), 0.0820849986238988],
 ['o', (0.2, 0.5), 0.6065306597126335]]

In [54]: max(max_p(data, g(data, nuevo)), key=lambda x: x[2])
Out[54]: ['o', (0.2, 0.5), 0.6065306597126335]

In [55]: 

也就是说,您最好向numpy 模块介绍自己

  1. 引入真正的数组并定义数组优化函数和运算符,
  2. 介绍了使用布尔表达式对数组进行索引的机会(即您最终想要的...)

另一个选项是pandas 模块,但其他人已经提到...

【讨论】:

    猜你喜欢
    • 2018-09-24
    • 2022-11-01
    • 2015-10-25
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多