একটি NumPy অ্যারে স্থানান্তর করা


191

আমি পাইথন এবং নুমপি ব্যবহার করি এবং "ট্রান্সপোজ" নিয়ে কিছু সমস্যা আছে:

import numpy as np
a = np.array([5,4])
print(a)
print(a.T)

ইনভোকিং a.Tঅ্যারে স্থানান্তর করছে না। যদি aউদাহরণস্বরূপ হয় [[],[]]তবে এটি সঠিকভাবে স্থানান্তরিত করে তবে আমার ট্রান্সপোজ দরকার [...,...,...]


"মুদ্রণ a.transpose" চেষ্টা করেছেন যা একই কিন্তু সফলতা ছাড়াই, ট্রান্সপোজ নয় ...
ধন্যবাদ

উত্তর:


246

এটি ঠিক যেমন কাজ করা হয়েছিল ঠিক তেমন কাজ করছে। 1D অ্যারের স্থানান্তর এখনও 1D অ্যারে! (যদি আপনি মতলব ব্যবহার করেন তবে এটির মৌলিকভাবে 1D অ্যারের ধারণা নেই Mat মতলবের "1D" অ্যারেগুলি 2D))

আপনি যদি নিজের 1 ডি ভেক্টরকে 2 ডি অ্যারে রূপান্তর করতে চান এবং তারপরে এটি স্থানান্তর করতে চান তবে কেবল এটি দিয়ে টুকরো টুকরো করুন np.newaxis(বা None, তারা একই রকম, newaxisআরও বেশি পঠনযোগ্য)।

import numpy as np
a = np.array([5,4])[np.newaxis]
print(a)
print(a.T)

সাধারণত যদিও বলতে গেলে, আপনার কখনই এই নিয়ে চিন্তা করার দরকার নেই। অতিরিক্ত মাত্রা যুক্ত করা সাধারণত আপনি যা চান তা হয় না, যদি আপনি কেবল অভ্যাসের বাইরে এটি করেন। নম্পি বিভিন্ন গণনা করার সময় স্বয়ংক্রিয়ভাবে একটি 1 ডি অ্যারে সম্প্রচার করবে। সাধারণত যখন কোনও ভেক্টর চান তখন একটি সারি ভেক্টর এবং কলাম ভেক্টর (যার মধ্যে কোনও ভেক্টর নয় তারা উভয়ই 2 ডি!) এর মধ্যে পার্থক্য করার প্রয়োজন নেই ।


2
@ কথা বলা - আমি কেবল np.arangeদ্রুত 1 ডি অ্যারে তৈরি করতাম । এটি ঠিক একই জন্য কাজ করে a = np.array([5,4])
জো কিংটন

2
@ থ্যাঙ্কিং আপনি যদি অদ্ভূত হয়ে নতুন হন - মনে রাখবেন যে বৃত্তাকার বন্ধনীগুলি ()আঙ্কে কোনও অতিরিক্ত মাত্রা নির্দেশ করে না। তাহলে a = np.arange(10)তারপর aহয় array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])যেমন দ্বারা উত্পাদিতa.__repr__()a.ndim --> 1বর্গাকার বন্ধনী দ্বারা সূচিত হিসাবে এটি একটি 1-মাত্রিক (অর্থাত্ ) ভেক্টর []array( ... )দেখা যায় না যখন আপনি হয় না print(a)বা a.__str__()
dtlussier

7
@ জোকিটিংটন এমন একটি পরিস্থিতি রয়েছে যে 1 ডি অ্যারের সম্প্রচার দরকারী। একটি অ্যারেতে সমস্ত 1 ডি পয়েন্টের মধ্যে দূরত্ব গণনা করা হচ্ছে। আপনার সমাধানটির জন্য ধন্যবাদ x - x [np.newaxis] করতে পারেন T যা টি দূরত্বের ম্যাট্রিক্স দেয়
জুয়ানপিআই

4
ব্যক্তিগতভাবে, আমি এটি np.vstack()অপারেশন আরো স্পষ্ট হতে: print np.vstack(a)
আলেকজান্ডার পোজডনিভ

2
এটি কেবল মতলব নয়, লিনিয়ার বীজগণিতের একটি সারি / কলাম ভেক্টর ধারণা রয়েছে। নম্পি কেবল মতলব নয়, প্রচুর জায়গা থেকে আগত লোকদের কাছে মূর্তিমান।
এরিক

133

একের পরিবর্তে দুটি ব্র্যাকেট জোড়া ব্যবহার করুন। এটি একটি 2 ডি অ্যারে তৈরি করে, যা আপনি 1 ব্রাকেট জুটি ব্যবহার করেন এমন 1D অ্যারে তৈরির বিপরীতে স্থানান্তরিত হতে পারে।

import numpy as np    
a = np.array([[5, 4]])
a.T

আরও পুঙ্খানুপুঙ্খ উদাহরণ:

>>> a = [3,6,9]
>>> b = np.array(a)
>>> b.T
array([3, 6, 9])         #Here it didn't transpose because 'a' is 1 dimensional
>>> b = np.array([a])
>>> b.T
array([[3],              #Here it did transpose because a is 2 dimensional
       [6],
       [9]])

shapeএখানে কী চলছে তা দেখতে নম্পটির পদ্ধতিটি ব্যবহার করুন:

>>> b = np.array([10,20,30])
>>> b.shape
(3,)
>>> b = np.array([[10,20,30]])
>>> b.shape
(1, 3)

11
আমি এই সমাধানটিকে [np.newaxis] একটিকে পছন্দ করি, এটি আরও মার্জিত ইমো দেখায়।
ফিলম্যাককে

যন্ত্রগুলি তেমন বুদ্ধিমান নয়। এমনকি আপনার একমাত্র স্ত্রী থাকলেও এটি আপনার প্রথম স্ত্রী হিসাবে ঘোষণা করা উচিত।
শ্রীরাগ এআর

এটি নির্বাচিত উত্তর হওয়া উচিত
ব্রুনো

79

1 ডি অ্যারেগুলির জন্য :

a = np.array([1, 2, 3, 4])
a = a.reshape((-1, 1)) # <--- THIS IS IT

print a
array([[1],
       [2],
       [3],
       [4]])

একবার আপনি বুঝতে পারছেন যে এখানে -1 এর অর্থ "যতগুলি সারি প্রয়োজন হিসাবে", আমি এটি একটি অ্যারের "ট্রান্সপোসোসিং" এর সবচেয়ে পঠনযোগ্য উপায় বলে মনে করি। যদি আপনার অ্যারে উচ্চ মাত্রার হয় তবে কেবল ব্যবহার করুন a.T


5
নোট করুন যে এটি কেবল ভেক্টরগুলির সাথেই কাজ করে। আপনি 2-মাত্রিক অ্যারে অপারেশন থাকে transposeএবং reshapeবিভিন্ন উপায়ে অ্যারের সংশোধন করুন (ফলে ইমেজ আকৃতি একই, কিন্তু উপাদান ভিন্নভাবে স্থাপন করা হয়)।
jhndodo

2
আপনার মন্তব্যের জন্য ধন্যবাদ। আমি আপনার বক্তব্যটি দেখতে পাচ্ছি, তবে আমি মনে করি এটি আমার উত্তর পরিষ্কার করার চেয়ে আরও বেশি বিভ্রান্ত হয়েছে কারণ আমি @ টেক্সিং ফ্রেমগুলির সঠিক প্রশ্নের সঠিক এক-লাইন সমাধান দিই। এটি 2-ডি অ্যারে সম্পর্কে নয়, এটি প্রায় 1-ডি অ্যারে। আপেল এবং নাশপাতি এখানে।
উলফ আসলাক

2
অবশ্যই. আপনার উত্তরটি এই মামলার জন্য সঠিক এবং মার্জিত, আমি কখনও এর সমালোচনা করার কথা বলতে চাই নি। তবে প্রশ্নের শিরোনাম ("একটি নামপ্য অ্যারে ট্রান্সপোসিং") আমি সন্দেহ করি যে অনেক দর্শক আরও সাধারণ সমাধানের সন্ধান করতে এখানে আসবেন এবং আমি তাদের সতর্ক করতে চেয়েছিলাম যে এটি 2 ডি অ্যারেগুলিতে প্রযোজ্য নয়। অন্যথায় আপনার উত্তরটি ওপির প্রশ্নের প্রেক্ষিতে সঠিক এবং উপযুক্ত।
জোহাঁদো

@ উলফস্লাক, দয়া করে আপনার উত্তরটি আপডেট করুন যে আপনার পন্থা এনডি অ্যারেতে জেনারালযোগ্য নয়, জোন্ডোডো যে পরামর্শ দিয়েছিলেন তেমনই সামনে পরিষ্কার হওয়া ভাল, যাতে আপনার কৌশলটি অন্যায়ভাবে ব্যবহার না করা যায়! ..., প্রশ্নটি এখানে সঠিক উত্তরের জন্য & লাইনার না!!
আনু

18

স্কোয়ার ব্র্যাকেটের একটি অতিরিক্ত সেটটিতে মোড়ানো দ্বারা আপনি বিদ্যমান ভেক্টরকে ম্যাট্রিক্সে রূপান্তর করতে পারেন ...

from numpy import *
v=array([5,4]) ## create a numpy vector
array([v]).T ## transpose a vector into a matrix

নিম্পির একটি ক্লাসও রয়েছে matrix( অ্যারে বনাম ম্যাট্রিক্স দেখুন ) ...

matrix(v).T ## transpose a vector into a matrix

14

নপি 1D অ্যারে -> কলাম / সারির ম্যাট্রিক্স:

>>> a=np.array([1,2,4])
>>> a[:, None]    # col
array([[1],
       [2],
       [4]])
>>> a[None, :]    # row, or faster `a[None]`
array([[1, 2, 4]])

এবং হিসাবে @ জো-kington বলেন, আপনি প্রতিস্থাপন করতে পারেন Noneসঙ্গে np.newaxisপাঠযোগ্যতা জন্য।


10

1d অ্যারে 2 ডি কলামে স্থানান্তর করতে, আপনি এটি ব্যবহার করতে পারেন numpy.vstack:

>>> numpy.vstack(numpy.array([1,2,3]))
array([[1],
       [2],
       [3]])

এটি ভ্যানিলা তালিকার জন্যও কাজ করে:

>>> numpy.vstack([1,2,3])
array([[1],
       [2],
       [3]])

1
@ সান্দ্রসকোডেল্লার, আপনি কি কোডটি অন্তর্নিহিত দেখেছেন vstack? np.concatenate([atleast_2d(_m) for _m in tup], 0)। এটি অ্যারেগুলিকে (1,1) অ্যারেগুলিতে বিভক্ত করে এবং সেগুলি সংশ্লেষ করে! প্রক্রিয়াতে এটি একটি অনুলিপি তৈরি করে, যখন সমস্ত পুনঃনির্মাণটি একটি দৃষ্টিভঙ্গি দেয়।
এইচপলজ

3

আপনি কেবল একটি 2 ডি অ্যারে স্থানান্তর করতে পারেন। আপনি numpy.matrixএকটি 2 ডি অ্যারে তৈরি করতে ব্যবহার করতে পারেন । এটি তিন বছর দেরীতে, তবে আমি কেবলমাত্র সমাধানের সম্ভাব্য সেটগুলিতে যুক্ত করছি:

import numpy as np
m = np.matrix([2, 3])
m.T

এর ব্যবহারের np.matrixদরকার নেই এবং সাধারণত নিরুৎসাহিত করা হচ্ছে।
এইচপলজ




1

আমি কেবল উপরের পোস্টটি একত্রীকরণ করছি, আশা করি এটি অন্যদের কিছুটা সময় বাঁচাতে সহায়তা করবে:

নীচের অ্যারেটির (2, )মাত্রা রয়েছে এটি একটি 1-ডি অ্যারে,

b_new = np.array([2j, 3j])  

1-ডি অ্যারে স্থানান্তর করার দুটি উপায় রয়েছে:


"np.newaxis" বা কোনটি দিয়ে এটিকে টুকরো টুকরো করুন!

print(b_new[np.newaxis].T.shape)
print(b_new[None].T.shape)

লেখার অন্য উপায়, উপরের Tঅপারেশন ছাড়া !

print(b_new[:, np.newaxis].shape)
print(b_new[:, None].shape)

মোড়ানো [] বা এনপি.ম্যাট্রিক্স ব্যবহার করার অর্থ একটি নতুন মাত্রা যুক্ত করা!

print(np.array([b_new]).T.shape)
print(np.matrix(b_new).T.shape)

0

উপরে উল্লিখিত কিছু মন্তব্য হিসাবে, 1D অ্যারে স্থানান্তর 1D অ্যারে, সুতরাং 1D অ্যারে স্থানান্তর করার একটি উপায় হ'ল অ্যারেটিকে ম্যাট্রিক্সে রূপান্তর করা যেমন:

np.transpose(a.reshape(len(a), 1))


0

একটা পদ্ধতি উত্তর বর্ণনা করা কিন্তু বর্ণনা করা হয় ডকুমেন্টেশন জন্য numpy.ndarray.transposeপদ্ধতি:

1-ডি অ্যারের জন্য এটির কোনও প্রভাব নেই, কারণ ট্রান্সপোজড ভেক্টর কেবল একই ভেক্টর। 1-ডি অ্যারেটিকে 2 ডি কলাম ভেক্টরে রূপান্তর করতে, একটি অতিরিক্ত মাত্রা যুক্ত করতে হবে। np.atleast2d (a) .T এটি অর্জন করে, যেমন একটি [:, np.newaxis] করে।

যে কেউ করতে পারেন:

import numpy as np
a = np.array([5,4])
print(a)
print(np.atleast_2d(a).T)

কোনটি (ইমো) ব্যবহারের চেয়ে সুন্দর newaxis


0

মূলত ট্রান্সপোজ ফাংশনটি যা করে তা হ'ল অ্যারের আকার এবং ধাপগুলি অদলবদল করা:

>>> a = np.ones((1,2,3))

>>> a.shape
(1, 2, 3)

>>> a.T.shape
(3, 2, 1)

>>> a.strides
(48, 24, 8)

>>> a.T.strides
(8, 24, 48)

1 ডি নিম্পি অ্যারের ক্ষেত্রে (র‌্যাঙ্ক -1 অ্যারে) আকার এবং স্ট্রাইডগুলি 1-উপাদান টিপলস এবং এটিকে অদলবদল করা যায় না এবং এই জাতীয় 1 ডি অ্যারের স্থানান্তর এটি অপরিবর্তিত করে দেয় returns পরিবর্তে, আপনি একটি "সারি-ভেক্টর" (আকারের আঙ্কুল অ্যারে (1, n)) একটি "কলাম-ভেক্টর" (আকারের আঙ্কুল অ্যারে) তে স্থানান্তর করতে পারেন (n, 1)। এটি অর্জনের জন্য আপনাকে প্রথমে আপনার 1 ডি নাম্পার অ্যারেটিকে সারি-ভেক্টরে রূপান্তর করতে হবে এবং তারপরে আকার এবং স্ট্রাইডগুলি (এটি স্থানান্তর) বদল করতে হবে। নীচে একটি ফাংশন যা এটি করে:

from numpy.lib.stride_tricks import as_strided

def transpose(a):
    a = np.atleast_2d(a)
    return as_strided(a, shape=a.shape[::-1], strides=a.strides[::-1])

উদাহরণ:

>>> a = np.arange(3)
>>> a
array([0, 1, 2])

>>> transpose(a)
array([[0],
       [1],
       [2]])

>>> a = np.arange(1, 7).reshape(2,3)
>>> a     
array([[1, 2, 3],
       [4, 5, 6]])

>>> transpose(a)
array([[1, 4],
       [2, 5],
       [3, 6]])

অবশ্যই আপনার এটি করতে হবে না যেহেতু আপনার কাছে 1D অ্যারে রয়েছে এবং আপনি এটি সরাসরি (n, 1)অ্যারে রূপান্তর করতে পারেন a.reshape((-1, 1))বা দ্বারা a[:, None]। আমি কেবল প্রদর্শন করতে চেয়েছিলাম যে কোনও অ্যারের স্থানান্তর কীভাবে কাজ করে।


0

আমি এখন পর্যন্ত 1-ডি অ্যারেগুলির জন্য একটি কমপ্যাক্ট এবং পঠনযোগ্য উপায়ে এটি প্রয়োগ করতে শিখেছি:

h = np.array([1,2,3,4,5])

v1 = np.vstack(h)
v2 = np.c_[h]

h1 = np.hstack(v1)
h2 = np.r_[v2[:,0]]

numpy.r_ এবং numpy.c_ স্লাইস অবজেক্টগুলি যথাক্রমে প্রথম এবং দ্বিতীয় অক্ষের সাথে সংক্ষিপ্তকরণে অনুবাদ করুন। সুতরাং উল্লম্ব অ্যারে v2 অনুভূমিক অ্যারে h2 এর মধ্যে ফেরত দেওয়ার ক্ষেত্রে কাটা ভি 2 [:, 0]

numpy.vstack 1-D অ্যারে (এন,) এর আকার 1 (ডি, এন) এর পরে পুনরায় আকার দেওয়ার পরে প্রথম অক্ষের সাথে সংমিশ্রণের সমান। Vsplit দ্বারা বিভাজক অ্যারে পুনর্নির্মাণ

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.