二维0和0的阵列1s,切片和键在Python中设置返回

时间:2013-12-02 14:47:40

标签: python numpy

我在文本文件中有许多记录,代表'月'1-30的天数以及商店是开放还是关闭。这些信件代表了商店。

    A 00000000001000000000000000000
    B 11000000000000000000000000000
    C 00000000000000000000000000000
    D 00000000000000000000000000000
    E 00000000000000000000000000000
    F 00000000000000000000000000000
    G 00000000000000000000000000000
    H 00000000000000000000000000000
    I 11101111110111111011111101111
    J 11111111111111111111111111111
    K 00110000011000001100000110000
    L 00010000001000000100000010000
    M 00100000010000001000000100000
    N 00000000000000000000000000000
    O 11011111101111110111111011111

我想将1和0存储在一个数组中(我正在考虑numpy,但还有另一种方式(string,bitstring)我会很满意)。然后我希望能够切片一天,即一列,并将记录键放回一组。

e.g。

A 1
B 0
C 0
D 0
E 0
F 0
G 0
H 0
I 0
J 1
K 1
L 1
M 0
N 0
O 1

day10 = {A,J,K,L,O}

我也需要这样做尽可能高效。

6 个答案:

答案 0 :(得分:3)

我想出的最简单的解决方案:

shops = {}
with open('input.txt', 'r') as f:
    for line in f:
        name, month = line.strip().split()
        shops[name] = [d == '1' for d in month]

dayIndex = 14

result = [s for s,v in shops.iteritems() if v[dayIndex]]
print "Shops opened at",dayIndex,":",result

答案 1 :(得分:2)

一个笨拙的解决方案:

stores, isopen = np.genfromtxt('input.txt', dtype="S30", unpack=True)
isopen = np.array(map(list, isopen)).astype(bool)

然后,

>>> stores[isopen[:,10]]
array(['A', 'J', 'K', 'L', 'O'], 
      dtype='|S30')

答案 2 :(得分:1)

with open("datafile") as fin:
    D = {i[0]:int(i[:1:-1], 2) for i in fin}
days = [{k for k in D if D[k] & 1<<i} for i in range(31)]

只需在查询之间保留days变量

答案 3 :(得分:1)

首先,我会毫不犹豫地编写代码量,以便为bitarray提供帮助。

其次,我已经提出了BartoszKP的答案,因为它看起来是一种合理的方法。

最后,我会使用pandas而不是numpy来执行这样的任务,因为对于大多数任务来说,它将使用底层的numpy函数并且合理快速。

如果data包含您的数组作为字符串,则可以使用

转换为DataFrame
>>> df = pd.DataFrame([[x] +  map(int, y) 
...             for x, y in [l.split() for l in data.splitlines()]])
>>> df.columns = ['Shop'] + map(str, range(1, 30))

并使用

完成查找
>>> df[df['3']==1]['Shop']
8     I
9     J
10    K
12    M
Name: Shop, dtype: object

答案 4 :(得分:0)

使用多层字典:

all_shops = { 'shopA': { 1: True, 2: False, 3: True ...},
              .......}

然后您的查询被翻译为

def query(shop_name, day):
    return all_shops[shop_name][day]

答案 5 :(得分:0)

 with open("datafile") as f:
    for line in f:
        shop, _days = line.split()
        for i,d in enumerate(_days):
            if d == '1':
                days[i].add(shop)

更简单,更快速并回答问题