কীভাবে দুটি তালিকার উপাদান অনুসারে গুণ করা যায়?


137

পাইথনের মান অনুসারে দুটি তালিকাকে একসাথে গুন করতে আমি একটি উপাদান অনুসারে গুণিত করতে চাই, যেমন আমরা মতলব করতে পারি।

মতলব-এ এভাবেই করতাম।

a = [1,2,3,4]
b = [2,3,4,5]
a .* b = [2, 6, 12, 20]

একটি তালিকা ধী প্রত্যেক সংযুক্তির জন্য, 16 তালিকা এন্ট্রি দিতে হবে x * yএর xথেকে aএবং yথেকে b। এটি কীভাবে মানচিত্র করবেন সে সম্পর্কে অনিশ্চিত।

কেউ যদি কেন আগ্রহী তবে আমার কাছে একটি ডেটাসেট রয়েছে এবং এটি দিয়ে গুণতে চান Numpy.linspace(1.0, 0.5, num=len(dataset)) =)


4
আপনি যখন এখন ইন্দ্রিয়ার বিষয়ে ইতিমধ্যে জিজ্ঞাসা করছেন কেন?
pwuertz

2
এবং যাইহোক, এটি উপাদান-ভিত্তিক গুণ, এটি কোনও বিন্দু পণ্য নয়।
pwuertz

3
বিকল্প: মানচিত্র (ল্যাম্বদা এক্স, y: x * y, তালিকা 1, তালিকা 2) # উত্সাহ ...
xxjjnn

উত্তর:


284

মিশ্রিত একটি তালিকা বোধগম্য ব্যবহার করুন zip():।

[a*b for a,b in zip(lista,listb)]

9
অন্যদিকে, তারা যদি এখানে তুচ্ছ মামলার বাইরে অন্য কিছু করতে চান তবে ওপি নম্পিকে ব্যবহার করার জন্য পরামর্শ দেওয়া হবে।
হেনরি গমেরসাল

1
পাইথন 2 এ ইজিপ () আরও ভাল পছন্দ হতে পারে।
ইয়াক

23
আপনি ব্যবহার করতে পারেন map(lambda x,y:x*y,lista,listb)
mbomb007

যদি উত্তর পরিবর্তিত হয় তবে পরিবর্তিত listbধরণের উপাদানগুলির পরিবর্তে আমাদের তালিকা দেওয়া হয় এবং একটি তালিকা listbপেতে আমাদের পরিচালনা করতে হবে। যাত্রা। (x, পাই, ই) এর সাথে [(4, 5, 2), (1, 2, 4), (4, 5, 6), (1, 1, 2), (3, 3, 4)], যখন নেওয়া (x, পাই, ই) (4, 5, 2) দিয়ে পরিচালিত হয় এবং তারপরে (x, pi, e) (1, 2, 4) দিয়ে চালিত হয় ... ইত্যাদি।
gxyd

@gxyd আপনার আলাদা প্রশ্ন জিজ্ঞাসা করা উচিত
mbomb007

87

যেহেতু আপনি ইতিমধ্যে ব্যবহার করছেন তাই numpyএটি আপনার numpyতালিকার পরিবর্তে অ্যারের মধ্যে আপনার ডেটা সংরক্ষণ করে তোলে । একবার আপনি এটি করার পরে, আপনি উপাদান হিসাবে পণ্য যেমন পণ্য বিনামূল্যে পেতে:

In [1]: import numpy as np

In [2]: a = np.array([1,2,3,4])

In [3]: b = np.array([2,3,4,5])

In [4]: a * b
Out[4]: array([ 2,  6, 12, 20])

1
সম্ভবত সর্বাধিক বৈজ্ঞানিক না, তবে সময়সূত্র ব্যবহার করে গাহুর জবাবের বিপরীতে আমি এই সময়টি পেরেছি। জঞ্জাল পদ্ধতির তুলনায় নম্পি আসলে সামান্য ধীর।
চেজ রবার্টস

1
আমার ক্ষেত্রে, তালিকাগুলিতে বাইনারি মান রয়েছে তবে অজস্র দ্রবণটি ইজিপি ব্যবহারের চেয়ে অনেক দ্রুত ছিল।
Serendipity

গুগল অনুসন্ধান থেকে এখানে পৌঁছে অন্যের উপকারের জন্য আমি নীচে একটি সময়কালীন তুলনা অন্তর্ভুক্ত করেছি।
ধানেগ

31

এনপি.মলটিপ্লাই (ক, খ) ব্যবহার করুন:

import numpy as np
a = [1,2,3,4]
b = [2,3,4,5]
np.multiply(a,b)

21

আপনি প্রতিটি উপাদানকে একটি লুপে গুণতে চেষ্টা করতে পারেন। এটি করার জন্য সংক্ষিপ্ত হাতটি

ab = [a[i]*b[i] for i in range(len(a))]

স্ট্যাকওভারফ্লোতে স্বাগতম! কেবলমাত্র কোড-উত্তরগুলি নিরুৎসাহিত করা হয় - দয়া করে এটি কীভাবে প্রশ্নকারীর প্রশ্নের সমাধান করে তা সম্পর্কে কিছু ব্যাখ্যা যুক্ত করুন।
করলি ব্রিগম্যান

7
@ করলিব্রিগম্যান আমি একমত নই; একটি উত্তরের মধ্যে খুব সামান্য পার্থক্য আছে যা হ'ল "এখানে এটি করার একটি উপায়: <কোড>" এবং কেবল "<কোড>"। এই বিশেষ পরিস্থিতিতে "এই কোডটি আপনার সমস্যার সমাধান করে" ব্যতীত অন্য কিছু ব্যাখ্যা করার মতো কিছু নেই।
আইসড্রিটস

4
@ করলিব্রিগম্যান আমি একমত নই; ফলাফলগুলি প্রদর্শনের সাথে একটি উদাহরণ ডেটা আসলে আরও সহায়ক হবে
টজোররিমেরি

2
এইভাবে সি, সি ++, বা জাভা প্রোগ্রামার যিনি পাইথন আভিজাত্য সে সমস্যার সমাধান করবেন। গৃহীত উত্তর কথ্য পাইথন হয়।
ডেভিড কুলেন

@ টজুরিরিরি ফলাফলগুলি পরিষ্কার হয় কারণ তারা প্রশ্নে স্পষ্টভাবে অনুরোধ করা হয়েছে। তালিকা বোধগম্যতা কীভাবে কাজ করে তার একটি ব্যাখ্যা ভাল হতে পারে বা উল্লেখ করা যায় যে এটি তালিকা বোধগম্যতা ব্যবহার করে এবং তারপরে প্রত্যেকে এটিকে সন্ধান করতে পারে, যদি তারা তা না জানে।
xuiqzy

10

তবুও অন্য উত্তর:

-1... আমদানি প্রয়োজন
+1... খুব পঠনযোগ্য

import operator
a = [1,2,3,4]
b = [10,11,12,13]

list(map(operator.mul, a, b))

ফলাফলগুলি [10, 22, 36, 52]


যদি আপনি মানচিত্র জানেন, এটি সত্যিই পঠনযোগ্য সমাধান! ফাইলটির শীর্ষে থাকা ছাড়াও কি আমদানির কোনও নেতিবাচক ফলাফল রয়েছে? (সম্পাদকরা চাইলে আমদানিগুলি আড়াল করতে পারেন) যতদূর আমি দেখতে পাচ্ছি, এটি প্রতিটি অজগর 2 এবং 3 সংস্করণে পাওয়া উচিত!
xuiqzy

9

এটি করার মোটামুটি স্বজ্ঞাত উপায়:

a = [1,2,3,4]
b = [2,3,4,5]
ab = []                        #Create empty list
for i in range(0, len(a)):
     ab.append(a[i]*b[i])      #Adds each element to the list


4

বড় তালিকাগুলির জন্য, আমরা এটির মতো করে করতে পারি:

product_iter_object = itertools.imap(operator.mul, [1,2,3,4], [2,3,4,5])

product_iter_object.next() আউটপুট তালিকার প্রতিটি উপাদান দেয়।

আউটপুট দুটি ইনপুট তালিকার সংক্ষিপ্ত দৈর্ঘ্য হবে।


4

বেশী একটি অ্যারে তৈরি; প্রতিটি তালিকা বার অ্যারের গুণমান; অ্যারে একটি তালিকায় রূপান্তর করুন

import numpy as np

a = [1,2,3,4]
b = [2,3,4,5]

c = (np.ones(len(a))*a*b).tolist()

[2.0, 6.0, 12.0, 20.0]

3

গাহুয়ার উত্তর শিরোনামে বর্ণিত প্রশ্নের জন্য সঠিক, তবে তালিকাগুলি যদি ইতিমধ্যে নিম্পী বিন্যাস বা দশের চেয়ে বড় হয় তবে এটি আরও দ্রুত (প্রস্থের orders টি আদেশ) আরও পড়তে পারা যায়, যার ফলে প্রস্তাবিত অনুসারে সরল আঙ্কুল গুণ করা যায় do NPE। আমি এই সময়গুলি পেতে:

0.0049ms -> N = 4, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0075ms -> N = 4, a = [i for i in range(N)], c = a * b
0.0167ms -> N = 4, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0013ms -> N = 4, a = np.arange(N), c = a * b
0.0171ms -> N = 40, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0095ms -> N = 40, a = [i for i in range(N)], c = a * b
0.1077ms -> N = 40, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0013ms -> N = 40, a = np.arange(N), c = a * b
0.1485ms -> N = 400, a = [i for i in range(N)], c = [a*b for a,b in zip(a, b)]
0.0397ms -> N = 400, a = [i for i in range(N)], c = a * b
1.0348ms -> N = 400, a = np.arange(N), c = [a*b for a,b in zip(a, b)]
0.0020ms -> N = 400, a = np.arange(N), c = a * b

যেমন নিম্নলিখিত পরীক্ষা প্রোগ্রাম থেকে।

import timeit

init = ['''
import numpy as np
N = {}
a = {}
b = np.linspace(0.0, 0.5, len(a))
'''.format(i, j) for i in [4, 40, 400] 
                  for j in ['[i for i in range(N)]', 'np.arange(N)']]

func = ['''c = [a*b for a,b in zip(a, b)]''',
'''c = a * b''']

for i in init:
  for f in func:
    lines = i.split('\n')
    print('{:6.4f}ms -> {}, {}, {}'.format(
           timeit.timeit(f, setup=i, number=1000), lines[2], lines[3], f))

3

গণনা ব্যবহার করতে পারেন।

a = [1, 2, 3, 4]
b = [2, 3, 4, 5]

ab = [val * b[i] for i, val in enumerate(a)]

3

mapফাংশন এখানে খুব উপযোগী হতে পারে। ব্যবহার করে mapআমরা একটি পুনরাবৃত্তীয় প্রতিটি উপাদান কোনও ফাংশন প্রয়োগ করতে পারেন।

পাইথন 3.x

>>> def my_mul(x,y):
...     return x*y
...
>>> a = [1,2,3,4]
>>> b = [2,3,4,5]
>>>
>>> list(map(my_mul,a,b))
[2, 6, 12, 20]
>>>

অবশ্যই:

map(f, iterable)

সমতুল্য

[f(x) for x in iterable]

সুতরাং আমরা এর মাধ্যমে আমাদের সমাধান পেতে পারি:

>>> [my_mul(x,y) for x, y in zip(a,b)]
[2, 6, 12, 20]
>>>

পাইথন ২.x এর map()অর্থ: একটি পুনরাবৃত্তীয় প্রতিটি উপাদানকে একটি ফাংশন প্রয়োগ করুন এবং একটি নতুন তালিকা তৈরি করুন। পাইথন ৩.x এ mapতালিকার পরিবর্তে পুনরাবৃত্তকারী নির্মাণ করুন।

পরিবর্তে my_mulআমরা mulঅপারেটর ব্যবহার করতে পারে

পাইথন 2.7

>>>from operator import mul # import mul operator
>>>a = [1,2,3,4]
>>>b = [2,3,4,5]
>>>map(mul,a,b)
[2, 6, 12, 20]
>>>

পাইথন 3.5+

>>> from operator import mul
>>> a = [1,2,3,4]
>>> b = [2,3,4,5]
>>> [*map(mul,a,b)]
[2, 6, 12, 20]
>>>

দয়া করে নোট করুন যেহেতু map()একটি আয়রেটর তৈরি করে আমরা *একটি তালিকা পাওয়ার জন্য পুনরাবৃত্তিযোগ্য আনপ্যাকিং অপারেটরটি ব্যবহার করি । আনপ্যাকিং পদ্ধতিটি listনির্মাণকারীর থেকে কিছুটা দ্রুত :

>>> list(map(mul,a,b))
[2, 6, 12, 20]
>>>

1

তালিকাটি বজায় রাখতে, এবং এক লাইনে এটি করুন (অবশ্যই এনপি হিসাবে নাম্পি আমদানি করার পরে):

list(np.array([1,2,3,4]) * np.array([2,3,4,5]))

অথবা

list(np.array(a) * np.array(b))

0

আপনি এটি একই দৈর্ঘ্যের তালিকার জন্য ব্যবহার করতে পারেন

def lstsum(a, b):
    c=0
    pos = 0
for element in a:
   c+= element*b[pos]
   pos+=1
return c
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.