2015-11-19 4 views
2

Ищу способ векторизации это:как векторизовать это?

for x in range(1,N+1): 
    mul3ou5 = "inf"*(x%3 == 0)+"luans"*(x%5==0) 
    print str(x)*(mul3ou5 =="")+mul3ou5 

Идея заключается в том, чтобы использовать Numpy массив и заменить цикл по одной операции на Numpy массиве

заранее спасибо

+0

Можете ли вы дать минимальный пример ввода и вывода? В настоящее время трудно понять, чего вы пытаетесь достичь. –

+0

На английском языке эта игра называется FizzBuzz. – Conor

ответ

1

можно с pandas:

import pandas as pd 
# generating data set (N: number, S: resulting string) 
df = pd.DataFrame({'N': np.arange(1,N+1), 'S': np.arange(1,N+1) },columns=['N','S']) 
# convert col. S to string 
df['S']=df['S'].apply(str) 
# set empty string if x mod 3 == 0 or x mod 5 == 0 
df['S'][(df['N'].mod(3)==0) | (df['N'].mod(5)==0)] = "" 
# set mod 3 == 0 condition 
df['S'][(df['N'].mod(3)==0)] = "inf" 
# mod 5 == 0 
df['S'][(df['N'].mod(5)==0)] = df['S']+"luans" 

в результате в df['S'] ,

1

Присвоить ломтиков:

S = numpy.arange(1, N+1).astype('S8') 
S[2::3] = 'inf' 
S[4::5] = 'luans' 
S[14::15] = 'influans' 
2

Хотя @ morningsun Ответим велик, другой вариант это (с помощью boolean indexing):

import numpy as np 

x = np.arange(1, N+1) 
s = x.astype('S8') 
s[x % 3 == 0] = 'inf' 
s[x % 5 == 0] = 'luans' 
s[x % 15 == 0] = 'influans' 

который я нахожу более интуитивным, поскольку он сохраняет явный модуль (%) работа.

Смежные вопросы